rpc.pre_response
Назва події
rpc.pre_response
Константа
RpcEvent::PRE_RESPONSE
Клас
RpcPreResponseEvent
Властивості
RpcResponse $response, RpcRequest $rpcRequest, ?Service $service
Відповідь сформовано, але ще не відправлено. Генерується і для результату, і для помилки (тоді $service — null).
Коли генерується
- Після успішного виконання методу (перед
rpc.post_execute). - Після помилки виконання (з
rpc.error). - При прийомі notification або запиту з
$rpc.callback— з відповіддю-заглушкою (nullабо{"async": true, "callback": …}); пізніше, під час виконання методу, — ще раз зі справжньою відповіддю.
Не генерується для кешованої відповіді.
Вбудовані лістенери
| Пріоритет | Лістенер | Що робить |
|---|---|---|
| 1000 | ParamsConverterEventListener::objectToScalar |
Перетворює властивості об'єкта-результату на скаляри (enum, дати, UUID, сутності) і замінює відповідь |
| -100000 | RpcServer |
Забирає $event->rpcRequest->getResponseObject() як відповідь, що піде клієнту |
Що можна змінити
RpcResponse незмінний. Щоб замінити відповідь, установіть нову через запит з пріоритетом вище -100000:
$event->rpcRequest->setResponse(new RpcResponse($event->rpcRequest->getId(), $newResult));
- Присвоєння
$event->responseне змінює відповідь клієнту (але саме його отримаєrpc.post_response). - Лістенери з пріоритетом понад 1000 бачать сирий об'єкт результату, нижче 1000 — уже нормалізований масив.
- Для заглушки notification/callback заміна не діє.
- Не зупиняйте поширення вище -100000: відповідь не буде забрано.
Приклади використання
Маскування чутливих даних
#[AsEventListener(RpcEvent::PRE_RESPONSE, priority: 500)]
final class MaskEmailListener
{
public function __invoke(RpcPreResponseEvent $event): void
{
$result = $event->response->getResult();
if ($event->response->getError() !== null || !is_array($result) || !isset($result['email'])) {
return;
}
$result['email'] = preg_replace('/(?<=.).(?=[^@]*@)/', '*', $result['email']);
$event->rpcRequest->setResponse(new RpcResponse($event->rpcRequest->getId(), $result));
}
}
Інші ідеї
- логування відповідей (з урахуванням помилок:
$event->response->getError()); - додавання службових полів до результату для окремої групи API;
- збір метрик розміру відповіді.