rpc.pre_response

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;
  • збір метрик розміру відповіді.