Closed mesilov closed 2 years ago
Примеры хороших sdk от Валентина:
amazon официальная генерят инфу по методам автогенерённым phpdoc
ленивое создание объектов (базовый класс) до перехода по свойству массив не нормализуется в DTO. как только начали обходить- разложили.
большая экономия на создание объектов. доступ к свойствам за счёт php-док свойств, а на уровне магических геттеров. если api развивается быстрее api.
советы по сборке бандла для symfony
делаем либу как либу
делаем бандл и объявляет сервисы
подумать про дискавери в гугле
https://github.com/ruvents/runet-id-php-client -пример ленивых респонсов с автокомплитом.
Вводная информация
какие подходы закладываю при разработке 2 версии
текущий вариант второй версии SDK - WIP
Service – API-интерфейс для работы с конкретной сущностью
Зона ответственности:
Входящие данные:
Возвращаемый результат:
Core\Response
(????) к обсуждениюВ зависимости от метода может быть разный возвращаемый результат:
Если возвращать
Core\Response
, то в клиентском коде будут проблемы:Ожидание:
Текущая реализация — возвращается унифицированный результат:
Core – вызов произвольных API-методов
Зона ответственности:
expired_token
Входящие данные:
string $apiMethod
– название api-методаarray $parameters = []
– аргументы методаВозвращаемый результат:
Core\Response
– унифицированный объект-обёртка, содержит:Symfony\Contracts\HttpClient\ResponseInterface
— объект ответа от сервера, может быть асинхроннымCore\Commands\Command
— информация о команде\аргументах которая была исполнена, используется при разборе пакетных запросов.Для получения результата запроса к API используется метод
Response::getResponseData
, который декодирует тело ответа вызвав методSymfony\Contracts\HttpClient::toArray
Возвращается стандартизированный DTOResponseData
от API-сервера с полями:Result
- DTO c результатом исполнения запроса;Time
— DTO c таймингом прохождения запроса через сервера Битрикс24;Pagination
— DTO постраничной навигации с полямиnext
иtotal
;В случае обнаружения ошибок уровня домена будет выброшено соответствующее типизированное исключение.
Объект
Result
содержит методgetResultData
, который возвращает массив с результатом исполнения API-запроса. В зависимости от вызванного метода там может быть:ApiClient — работа с сетью и эндпоинтами API-серверов
Зона ответственности:
Используется: Symfony HttpClient
Входящие данные:
Возвращаемые результаты: —
Symfony\Contracts\HttpClient\ResponseInterface
Формат передачи данных по сети
JSON по HTTP/2 или HTTP/1.1
вопросы к обсуждению
референсы:
рекомендовали посмотреть
смотрим на лидеров по квадрату гартнера:
какой php-sdk* можно считать эталоном?
Не хочется на уровне сервиса работать с DTO Слишком много трудозатрат на SDK, пробовал в c48 (закрытая версия SDK), не всегда нужен полный объект
4.2. в транспортном слое попробовать возвращать типизированный результат для сущности которую этот транспорт обслуживает
варианты:
4.3. в транспортном слое сделать расширение методов для типовых операций с конкретной сущностью: 4.3.1 поддержка батч-режима для выборки возвращающая генератор 4.3.2 поддержка батч-режима для записи 4.3.3 поддержка записи с выборкой результата (сократится max число записываемых объектов с 50 до 49 + 1 запрос на выборку) 4.3.4 подумать над возможностью регистрации команд в нескольких транспортах и получении их за один зпрос пример: deals - получение сделки (транспорт 1) dealProductRows - получение табличной части сделки (транспорт 2) решение 1: возврат результата в callback \ промис ? решение 2: расширить транспорт родительской сущности специфическими методами - то, что чаще всего требуется: сущность + табличная часть
4.4. сервисный слой работающий с DTO (с48 в текущей реализации) оставить приватным и сконцентрироваться на других вещах:
советы по сборке бандла для symfony
текущий формат работы - по субботам (в любом случае отбирает достаточно много личного времени) какие варианты могут быть:
работа с комьюнити и маркетинг опенсорса: