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

1 + # rpc.post_execute
2 +
3 + ::::::block class="floatinginfobox floatinginfobox--fit"
4 + :::::columns border zebra
5 + ::::row
6 + :::col width="40%"
7 + **Назва події**
8 + :::
9 + :::col
10 + `rpc.post_execute`
11 + :::
12 + ::::
13 + ::::row
14 + :::col width="40%"
15 + **Константа**
16 + :::
17 + :::col
18 + `RpcEvent::POST_EXECUTE`
19 + :::
20 + ::::
21 + ::::row
22 + :::col width="40%"
23 + **Клас**
24 + :::
25 + :::col
26 + `RpcPostExecuteEvent`
27 + :::
28 + ::::
29 + ::::row
30 + :::col width="40%"
31 + **Властивості**
32 + :::
33 + :::col
34 + `mixed $result`, `RpcRequest $rpcRequest`, `Service $service`, `array $params`
35 + :::
36 + ::::
37 + ::::row
38 + :::col width="40%"
39 + **Вбудовані лістенери**
40 + :::
41 + :::col
42 + немає
43 + :::
44 + ::::
45 + :::::
46 + ::::::
47 +
48 + Генерується один раз після **успішного** виконання методу. `$result` — те, що повернув метод, `$params` — аргументи після конвертації.
49 +
50 + :::warning
51 + Подія генерується **після** `rpc.pre_response`: відповідь уже сформовано. Присвоєння нового `$result` не змінює те, що отримає клієнт. Щоб змінити відповідь, використовуйте [`rpc.pre_response`](/docs/api/json-rpc-bundle/functionality/events/pre_response).
52 + :::
53 +
54 + **Не генерується** при помилці (тоді буде `rpc.error`), для кешованої відповіді і для прийому notifications/callback.
55 +
56 + ## Приклади використання
57 +
58 + ### Час виконання методу
59 +
60 + ```php
61 + final class TimingListener
62 + {
63 + private array $started = [];
64 +
65 + #[AsEventListener(RpcEvent::PRE_EXECUTE, priority: 2000)]
66 + public function start(RpcPreExecuteEvent $event): void
67 + {
68 + $this->started[spl_object_id($event->rpcRequest)] = hrtime(true);
69 + }
70 +
71 + #[AsEventListener(RpcEvent::POST_EXECUTE)]
72 + public function finish(RpcPostExecuteEvent $event): void
73 + {
74 + $key = spl_object_id($event->rpcRequest);
75 + $ms = (hrtime(true) - ($this->started[$key] ?? hrtime(true))) / 1e6;
76 + unset($this->started[$key]);
77 + $this->metrics->histogram('rpc_duration_ms', $ms, ['method' => $event->service->name]);
78 + }
79 + }
80 + ```
81 +
82 + ### Доменні події
83 +
84 + Після успішного `Order.pay` опублікувати подію в шину застосунку:
85 +
86 + ```php
87 + #[AsEventListener(RpcEvent::POST_EXECUTE)]
88 + final class OrderPaidListener
89 + {
90 + public function __construct(private MessageBusInterface $bus) {}
91 +
92 + public function __invoke(RpcPostExecuteEvent $event): void
93 + {
94 + if ($event->service->name === 'Order.pay' && $event->result === true) {
95 + $this->bus->dispatch(new OrderPaid($event->params['orderId']));
96 + }
97 + }
98 + }
99 + ```
100 +
101 + :::tip
102 + Важкі дії, які не мають затримувати клієнта, переносьте в [`rpc.post_response`](/docs/api/json-rpc-bundle/functionality/events/post_response) — вона генерується після відправлення відповіді.
103 + :::