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).