rpc.post_response

rpc.post_response

Назва події

rpc.post_response

Константа

RpcEvent::POST_RESPONSE

Клас

RpcPostResponseEvent

Властивості

RpcResponse $response, RpcRequest $rpcRequest, Service $service

Клієнт уже отримав відповідь. Подія для важкої роботи, яка не повинна затримувати відповідь: аудит, відправка листів, інвалідація кешу, інтеграції.

Коли генерується

Один раз на кожен успішно виконаний запит:

Джерело Момент
HTTP kernel.terminate, після fastcgi_finish_request() (під PHP-FPM клієнт не чекає)
Консоль, дочірні процеси batch console.terminate
Inline batch одразу після кожного елемента
RpcExecutor (адаптери) kernel.terminate основного запиту

Не генерується для відповіді з помилкою, кешованої відповіді і для повідомлень з Symfony Messenger.

Виняток у лістенері пишеться в лог і не впливає на інших лістенерів та інші запити.

Вбудовані лістенери

Пріоритет Лістенер Що робить
1000 CacheRelationsEventListener Інвалідує й прогріває кеш за #[RPC\CacheRelation]
10 AsyncServerEventListener::processAsync Виконує notifications і запити з $rpc.callback (або передає від'єднаному процесу)

Не зупиняйте поширення з пріоритетом вище 10: notifications і callback-запити тоді ніколи не виконаються.

Для notifications і callback $event->response — заглушка; справжній результат після пріоритету 10 доступний у $event->rpcRequest->getResponseObject().

Що можна змінити

Нічого у відповіді — вона вже відправлена. Лише побічні дії.

Приклади використання

Аудит змін

#[AsEventListener(RpcEvent::POST_RESPONSE)]
final class AuditListener
{
    public function __construct(private AuditLog $audit, private ApiGroupContext $groups) {}

    public function __invoke(RpcPostResponseEvent $event): void
    {
        $this->audit->record(
            method: $event->service->name,
            params: $event->rpcRequest->getParams(),
            group: $this->groups->getGroup(),
        );
    }
}

Інтеграція після відповіді

Відправити вебхук партнеру чи синхронізувати дані з CRM, не затримуючи клієнта. Для дуже довгих операцій краще передати роботу в чергу Symfony Messenger.

HTTP-запит Symfony у цей момент уже знято з RequestStack. Якщо потрібні його заголовки, беріть їх з RequestCarrier (getCarrier()->getHttpRequest() для IRpcHttpCarrier).