API интеграция (sApi)
С тандартная интеграция
sCommerce сам по себе не регистрирует роуты /{base}/{version}/*. API-эндпоинты появляются только если установлен seiger/sapi, который находит провайдеры роутов через Composer-метаданные (extra.sapi.route_providers).
Orders API роуты
Пакет предоставляет endpoint orders через:
- Route provider:
Seiger\sCommerce\Api\Routes\OrdersRouteProvider - Роуты:
GET /{base}/{version}/ordersPUT /{base}/{version}/orders/{orderId}
Точные {base} и {version} определяются конфигурацией/дискавери sApi.
Update flow (PUT /orders/orderId)
Seiger\sCommerce\Api\Controllers\OrdersController@update сделан намеренно “тонким”:
- Найти
sOrderпо id или вернуть404. - Зарезолвить 3 сервиса из контейнера:
OrderUpdateMapperInterfaceOrderUpdateValidatorInterfaceOrderUpdateApplierInterface
- Запустить пайплайн обновления:
$mapper->map($payload)→ canonical array$validator->validate($canonical)→422при ошибках валидацииDB::transaction(fn() => $applier->apply($order, $validated) + $order->save())
- Вернуть
ApiResponse::success($order, '').
Vendor-дефолты регистрируются в Seiger\sCommerce\sCommerceServiceProvider только если:
- установлен sApi (проверка
interface_exists(\Seiger\sApi\Contracts\RouteProviderInterface::class)), и - интерфейс ещё не
bound()(чтобы проектные overrides имели приоритет).
Кастомная интеграция (если стандартный контракт не подходит)
П оддерживаются 2 уровня кастомизации: override логики (рекомендуется) и override роутов.
1) Override маппинга/валидации/apply (рекомендуется)
Оставляем vendor роуты + контроллер, но принимаем проектный формат payload через DI overrides.
Создайте проектные реализации:
- Mapper (внешний payload → canonical):
implements OrderUpdateMapperInterface - Validator (canonical → нормализованные данные):
implements OrderUpdateValidatorInterface - Applier (нормализованные данные → изменения
sOrder):implements OrderUpdateApplierInterface
И зарегистрируйте bindings в custom ServiceProvider:
$this->app->bind(\Seiger\sCommerce\Api\Contracts\OrderUpdateMapperInterface::class, \Project\Api\OrderUpdateMapper::class);
$this->app->bind(\Seiger\sCommerce\Api\Contracts\OrderUpdateValidatorInterface::class, \Project\Api\OrderUpdateValidator::class);
$this->app->bind(\Seiger\sCommerce\Api\Contracts\OrderUpdateApplierInterface::class, \Project\Api\OrderUpdateApplier::class);
Подключите ServiceProvider через core/custom/config/app/providers/*.php (имя файла управляет порядком загрузки).
2) Override route provider (полная замена endpoint)
Если стандартный endpoint/контроллер не подходит, реализуйте свой RouteProviderInterface и зарегистрируйте его в core/custom/composer.json в extra.sapi.route_providers для того же {version}/{endpoint}. sApi discovery отдаёт приоритет custom descriptor над vendor.