mesilov / bitrix24-php-sdk

A powerful PHP library for the Bitrix24 REST API
MIT License
409 stars 159 forks source link

обсудить архитектуру SDK и подходы к реализации с vudaltsov #196

Closed mesilov closed 2 years ago

mesilov commented 3 years ago

Вводная информация

  1. Библиотека представляет собой обёртку для работы с rest-api Bitrix24 https://dev.1c-bitrix.ru/rest_help/
  2. я не являюсь сотрудником Битрикс и это мой пет-проект
  3. обсуждаем новую версию sdk - 2.x https://github.com/mesilov/bitrix24-php-sdk/tree/2.x
  4. официальный PHP клиент Б24 выглядит так - https://github.com/bitrix-tools/crest, они его промоутят в документации и учебных курсах.

какие подходы закладываю при разработке 2 версии

текущий вариант второй версии SDK - WIP

Service – API-интерфейс для работы с конкретной сущностью

Зона ответственности:

Входящие данные:

Возвращаемый результат:

В зависимости от метода может быть разный возвращаемый результат:

Если возвращать Core\Response, то в клиентском коде будут проблемы:

// добавили сделку в Б24
$dealId = $dealsService->add($newDeal)->getResponseData()->getResult()->getResultData()[0];
// получили массив сделок
$deals = $dealsService->list([], [], [], 0)->getResponseData()->getResult()->getResultData();

Ожидание:

 add(array $newDeal):int // идентификатор новой сделки
 list(array $order, array $filter, array $select, int $start):array //массив сделок + постраничка
 get(int $dealId):array // конкретная сделка

Текущая реализация — возвращается унифицированный результат:

add(array $newDeal):Core\Response
list(array $order, array $filter, array $select, int $start):Core\Response

Core – вызов произвольных API-методов

Зона ответственности:

Входящие данные:

Возвращаемый результат: Core\Responseунифицированный объект-обёртка, содержит:

Для получения результата запроса к API используется метод Response::getResponseData, который декодирует тело ответа вызвав метод Symfony\Contracts\HttpClient::toArray Возвращается стандартизированный DTO ResponseData от API-сервера с полями:

В случае обнаружения ошибок уровня домена будет выброшено соответствующее типизированное исключение.

Объект Result содержит метод getResultData, который возвращает массив с результатом исполнения API-запроса. В зависимости от вызванного метода там может быть:

ApiClient — работа с сетью и эндпоинтами API-серверов

Зона ответственности:

Используется: Symfony HttpClient

Входящие данные:

Возвращаемые результаты: — Symfony\Contracts\HttpClient\ResponseInterface

Формат передачи данных по сети

JSON по HTTP/2 или HTTP/1.1

вопросы к обсуждению

  1. какие улучшения в архитектуре и DX могут быть?
  2. какие ожидания к хорошему SDK?

референсы:

рекомендовали посмотреть

смотрим на лидеров по квадрату гартнера:

какой php-sdk* можно считать эталоном?

  1. Отакзываемся от DTO\моделей и работаем с массивами? 3.1 Как можно сделать автокомплит без DTO?

Не хочется на уровне сервиса работать с DTO Слишком много трудозатрат на SDK, пробовал в c48 (закрытая версия SDK), не всегда нужен полный объект

  1. предложения по развитию к обсуждению: 4.1 сервисный слой переименовать в транспортный и отказаться от идеи напилить 100500 DTO (разве что в платной версии, лол)

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 в текущей реализации) оставить приватным и сконцентрироваться на других вещах:

  1. советы по сборке бандла для symfony

  2. текущий формат работы - по субботам (в любом случае отбирает достаточно много личного времени) какие варианты могут быть:

    • пойти на контракт в Б24 и пилить её уже как заказной проект \ просить доп. руки у вендора
    • продажа консультаций по работе с SDK-разработке приложений корпам
    • забить и пилить только то что инетерсно самому себе, а не пытаться сделать цельный продукт)
    • патреон\спонсорство etc.
  3. работа с комьюнити и маркетинг опенсорса:

    • чем лучше официальной
    • как монивировать людей контрибьютить в проект?
    • народ как правило пользует стандартные примеры из документации
mesilov commented 3 years ago

Примеры хороших sdk от Валентина:

большая экономия на создание объектов. доступ к свойствам за счёт php-док свойств, а на уровне магических геттеров. если api развивается быстрее api.

mesilov commented 3 years ago

советы по сборке бандла для symfony

  1. делаем либу как либу

    • используем http-contracts, а не клииент!
  2. делаем бандл и объявляет сервисы

mesilov commented 3 years ago
mesilov commented 3 years ago

подумать про дискавери в гугле

mesilov commented 3 years ago

https://github.com/ruvents/runet-id-php-client -пример ленивых респонсов с автокомплитом.

https://github.com/symfony/contracts/tree/main/HttpClient