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