rpc.post_execute

← rpc.post_execute

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/json-rpc-bundle/functionality/events/post_execute.md новий файл +103 −0

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 — вона генерується після відправлення відповіді.