Используйте SDK в приложении на Laravel

PHP

Сервис-провайдер, фасад Slen и файл конфигурации PHP SDK — что приложение на Laravel получает от пакета и что задаёт в своём окружении.

5 мин чтения

PHP SDK поставляется с сервис-провайдером для Laravel. Он читает настройки SDK из окружения вашего приложения, собирает из них один SDK и кладёт его в контейнер. Ваш код получает этот SDK по типу или вызывает его через фасад Slen.

Настроить

Laravel сам находит сервис-провайдер и фасад пакета через обнаружение пакетов, как только пакет установлен, — команду установки даёт статья Установка.

1. Положите ключ в окружение

Добавьте API-ключ в файл .env вашего приложения или в окружение, в котором работает его сервер.

.env
SLEN_API_KEY=sl_live_…

У каждой другой настройки есть значение по умолчанию, а таблица ниже называет переменную каждой.

2. Опубликуйте файл конфигурации, если нужен свой

Terminal
php artisan vendor:publish --tag=slen-sdk-config

Команда копирует config/slen-sdk.php в ваше приложение, где его можно менять. Без копии читается файл пакета, и переменные действуют точно так же.

Файл конфигурации

КлючТипПо умолчаниюПеременная окруженияОпция клиента
api_keystringnullSLEN_API_KEYapiKey
timeoutfloat65.0SLEN_TIMEOUTtimeout
connect_timeoutfloat5.0SLEN_CONNECT_TIMEOUTconnectTimeout
retriesint2SLEN_RETRIESretries
log_channelstringnullSLEN_LOG_CHANNEL—
spansstring'null'SLEN_SPANS—
span_levelstring'info'SLEN_SPAN_LEVEL—
webhook_secretstringnullSLEN_WEBHOOK_SECRETwebhookSecret
webhook_toleranceint300SLEN_WEBHOOK_TOLERANCEwebhookToleranceSeconds
  • Ключ файла читает переменную, которую называет таблица. Без переменной у него значение по умолчанию.

  • Последняя колонка — опция SDK, которой становится ключ. Для чего каждая опция, говорит статья Конфигурация.

  • SLEN_LOG_CHANNEL называет канал из config/logging.php, в который идёт журнал SDK. Без неё журнал идёт в логгер вашего приложения — Журнал.

  • SLEN_SPANS=log пишет спаны в тот же логгер, на уровне, который называет SLEN_SPAN_LEVEL. Любое другое значение никуда их не пишет. Чтобы отправлять их куда-то ещё, привяжите в контейнере свой записывающий к Slen\Sdk\Observability\SpanRecorderInterface — Спаны.

  • SLEN_WEBHOOK_SECRET — секрет подписи, которым вебхуки SDK проверяют доставки, — Вебхуки.

  • Значения проверяются, когда SDK впервые берут из контейнера: при пустом ключе или таймауте, равном нулю или не являющемся числом, там выбрасывается InvalidArgumentException.

Обратиться к Slen

Фасад вызывает SDK из контейнера. Каждый модуль SDK — метод фасада.

PHP
use Slen\Sdk\Laravel\Slen;
use Slen\Sdk\Modules\Operations\Options\ExecuteOptions;

$execution = Slen::operations()->execute(
    'generate_email',
    ['messages' => [['role' => 'user', 'content' => 'Write a short follow-up email.']]],
    new ExecuteOptions(idempotencyKey: 'order-42:email'),
);

echo $execution->status->value, PHP_EOL;

SDK один на всё приложение. Любой класс, который собирает контейнер, — контроллер, задача, команда — может получить его по типу, Slen\Sdk\SlenSdk, в конструкторе или в методе. Вне такого класса попросите его у контейнера.

PHP
use Slen\Sdk\SlenSdk;

$slen = app(SlenSdk::class);

$customer = $slen->customers()->get('user_8421');

foreach ($customer->accounts as $account) {
    echo $account->creditType, ' ', $account->available, PHP_EOL;
}

У SDK нет статического состояния, поэтому он безопасен в воркере, который обслуживает много запросов, — Запустить под Octane.

В тесте вашего приложения привяжите Slen\Sdk\SlenSdk к SDK, собранному на тестовом дублёре из статьи Тестирование интеграции, вместо того, который собирает провайдер.

Запустить под Octane

Под Laravel Octane — на FrankenPHP, RoadRunner или Swoole — воркер обслуживает много запросов один за другим, и SDK из контейнера может жить столько же, сколько воркер.

  • У SDK нет статического состояния, и после сборки он не меняется, поэтому один запрос ничего не оставляет в нём следующему.

  • Чтобы писать журнал одного запроса в его собственный логгер, возьмите копию: SlenSdk::withLogger() возвращает новый SDK поверх того же HTTP-клиента, а SDK из контейнера сохраняет свой логгер — Журнал.

  • Перечислите SlenSdk и SlenConfig в warm файла config/octane.php. Тогда воркер собирает SDK при старте, и его HTTP-клиент держит соединения открытыми от одного запроса к другому.

  • Воркер читает файл конфигурации один раз. После изменения окружения или config/slen-sdk.php перезапустите воркеры командой php artisan octane:reload.

  • Не ждите запуск внутри запроса: ожидание спит в воркере столько, сколько идёт запуск. Отправьте запуск через operations.executeAsync() и читайте результат из вебхука execution.finished или в задаче вашей очереди — Асинхронные запуски и ожидание.

  • Дайте запуску внутри запроса свой таймаут и своё число повторов, чтобы он не длился дольше запроса, — Повторы и таймауты.

  • Один SDK обращается к Slen с одним API-ключом. Приложение, которое обращается несколькими ключами, собирает по SDK на каждый и держит их в контейнере, а не в своём статическом свойстве.

  • FakeHttpClient и RecordingSpanRecorder хранят каждый запрос и каждый спан, которые им передали. Им место в тестах, а не в воркере.

Что читать дальше

Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d