rpc.post_execute
Назва події
rpc.post_execute
Константа
RpcEvent::POST_EXECUTE
Клас
RpcPostExecuteEvent
Властивості
mixed $result, RpcRequest $rpcRequest, Service $service, array $params
Вбудовані лістенери
немає
Генерується один раз після успішного виконання методу. $result — те, що повернув метод, $params — аргументи після конвертації.
Подія генерується після rpc.pre_response: відповідь уже сформовано. Присвоєння нового $result не змінює те, що отримає клієнт. Щоб змінити відповідь, використовуйте rpc.pre_response.
Не генерується при помилці (тоді буде rpc.error), для кешованої відповіді і для прийому notifications/callback.
Приклади використання
Час виконання методу
final class TimingListener
{
private array $started = [];
#[AsEventListener(RpcEvent::PRE_EXECUTE, priority: 2000)]
public function start(RpcPreExecuteEvent $event): void
{
$this->started[spl_object_id($event->rpcRequest)] = hrtime(true);
}
#[AsEventListener(RpcEvent::POST_EXECUTE)]
public function finish(RpcPostExecuteEvent $event): void
{
$key = spl_object_id($event->rpcRequest);
$ms = (hrtime(true) - ($this->started[$key] ?? hrtime(true))) / 1e6;
unset($this->started[$key]);
$this->metrics->histogram('rpc_duration_ms', $ms, ['method' => $event->service->name]);
}
}
Доменні події
Після успішного Order.pay опублікувати подію в шину застосунку:
#[AsEventListener(RpcEvent::POST_EXECUTE)]
final class OrderPaidListener
{
public function __construct(private MessageBusInterface $bus) {}
public function __invoke(RpcPostExecuteEvent $event): void
{
if ($event->service->name === 'Order.pay' && $event->result === true) {
$this->bus->dispatch(new OrderPaid($event->params['orderId']));
}
}
}
Важкі дії, які не мають затримувати клієнта, переносьте в rpc.post_response — вона генерується після відправлення відповіді.