rpc.pre_response

← rpc.pre_response

Ashterix

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

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

1 + # rpc.pre_response
2 +
3 + ::::::block class="floatinginfobox floatinginfobox--fit"
4 + :::::columns border zebra
5 + ::::row
6 + :::col width="40%"
7 + **Назва події**
8 + :::
9 + :::col
10 + `rpc.pre_response`
11 + :::
12 + ::::
13 + ::::row
14 + :::col width="40%"
15 + **Константа**
16 + :::
17 + :::col
18 + `RpcEvent::PRE_RESPONSE`
19 + :::
20 + ::::
21 + ::::row
22 + :::col width="40%"
23 + **Клас**
24 + :::
25 + :::col
26 + `RpcPreResponseEvent`
27 + :::
28 + ::::
29 + ::::row
30 + :::col width="40%"
31 + **Властивості**
32 + :::
33 + :::col
34 + `RpcResponse $response`, `RpcRequest $rpcRequest`, `?Service $service`
35 + :::
36 + ::::
37 + :::::
38 + ::::::
39 +
40 + Відповідь сформовано, але ще не відправлено. Генерується і для результату, і для помилки (тоді `$service` — `null`).
41 +
42 + ## Коли генерується
43 +
44 + * Після успішного виконання методу (перед `rpc.post_execute`).
45 + * Після помилки виконання (з `rpc.error`).
46 + * При прийомі notification або запиту з `$rpc.callback` — з відповіддю-заглушкою (`null` або `{"async": true, "callback": …}`); пізніше, під час виконання методу, — ще раз зі справжньою відповіддю.
47 +
48 + **Не генерується** для кешованої відповіді.
49 +
50 + ## Вбудовані лістенери
51 +
52 + | Пріоритет | Лістенер | Що робить |
53 + | --- | --- | --- |
54 + | 1000 | `ParamsConverterEventListener::objectToScalar` | Перетворює властивості об'єкта-результату на скаляри (enum, дати, UUID, сутності) і замінює відповідь |
55 + | -100000 | `RpcServer` | Забирає `$event->rpcRequest->getResponseObject()` як відповідь, що піде клієнту |
56 +
57 + ## Що можна змінити
58 +
59 + `RpcResponse` незмінний. Щоб замінити відповідь, установіть нову через запит **з пріоритетом вище -100000**:
60 +
61 + ```php
62 + $event->rpcRequest->setResponse(new RpcResponse($event->rpcRequest->getId(), $newResult));
63 + ```
64 +
65 + * Присвоєння `$event->response` **не** змінює відповідь клієнту (але саме його отримає `rpc.post_response`).
66 + * Лістенери з пріоритетом понад 1000 бачать сирий об'єкт результату, нижче 1000 — уже нормалізований масив.
67 + * Для заглушки notification/callback заміна не діє.
68 + * Не зупиняйте поширення вище -100000: відповідь не буде забрано.
69 +
70 + ## Приклади використання
71 +
72 + ### Маскування чутливих даних
73 +
74 + ```php
75 + #[AsEventListener(RpcEvent::PRE_RESPONSE, priority: 500)]
76 + final class MaskEmailListener
77 + {
78 + public function __invoke(RpcPreResponseEvent $event): void
79 + {
80 + $result = $event->response->getResult();
81 + if ($event->response->getError() !== null || !is_array($result) || !isset($result['email'])) {
82 + return;
83 + }
84 +
85 + $result['email'] = preg_replace('/(?<=.).(?=[^@]*@)/', '*', $result['email']);
86 + $event->rpcRequest->setResponse(new RpcResponse($event->rpcRequest->getId(), $result));
87 + }
88 + }
89 + ```
90 +
91 + ### Інші ідеї
92 +
93 + * логування відповідей (з урахуванням помилок: `$event->response->getError()`);
94 + * додавання службових полів до результату для окремої групи API;
95 + * збір метрик розміру відповіді.