docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api
uk/docs/api/json-rpc-bundle/functionality/events/post_response.md
новий файл +101
−0
1
+
# rpc.post_response
2
+
3
+
::::::block class="floatinginfobox floatinginfobox--fit"
4
+
:::::columns border zebra
5
+
::::row
6
+
:::col width="40%"
7
+
**Назва події**
8
+
:::
9
+
:::col
10
+
`rpc.post_response`
11
+
:::
12
+
::::
13
+
::::row
14
+
:::col width="40%"
15
+
**Константа**
16
+
:::
17
+
:::col
18
+
`RpcEvent::POST_RESPONSE`
19
+
:::
20
+
::::
21
+
::::row
22
+
:::col width="40%"
23
+
**Клас**
24
+
:::
25
+
:::col
26
+
`RpcPostResponseEvent`
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
+
Клієнт уже отримав відповідь. Подія для важкої роботи, яка не повинна затримувати відповідь: аудит, відправка листів, інвалідація кешу, інтеграції.
41
+
42
+
## Коли генерується
43
+
44
+
Один раз на кожен **успішно** виконаний запит:
45
+
46
+
| Джерело | Момент |
47
+
| --- | --- |
48
+
| HTTP | `kernel.terminate`, після `fastcgi_finish_request()` (під PHP-FPM клієнт не чекає) |
49
+
| Консоль, дочірні процеси batch | `console.terminate` |
50
+
| Inline batch | одразу після кожного елемента |
51
+
| `RpcExecutor` (адаптери) | `kernel.terminate` основного запиту |
52
+
53
+
**Не генерується** для відповіді з помилкою, кешованої відповіді і для повідомлень з Symfony Messenger.
54
+
55
+
Виняток у лістенері пишеться в лог і не впливає на інших лістенерів та інші запити.
56
+
57
+
## Вбудовані лістенери
58
+
59
+
| Пріоритет | Лістенер | Що робить |
60
+
| --- | --- | --- |
61
+
| 1000 | `CacheRelationsEventListener` | Інвалідує й прогріває кеш за [`#[RPC\CacheRelation]`](/docs/api/json-rpc-bundle/add_rpc_service/cache) |
62
+
| 10 | `AsyncServerEventListener::processAsync` | **Виконує** [notifications](/docs/api/json-rpc-bundle/functionality/notifications) і запити з [`$rpc.callback`](/docs/api/json-rpc-bundle/functionality/callback) (або передає від'єднаному процесу) |
63
+
64
+
:::danger
65
+
Не зупиняйте поширення з пріоритетом вище 10: notifications і callback-запити тоді ніколи не виконаються.
66
+
:::
67
+
68
+
Для notifications і callback `$event->response` — заглушка; справжній результат після пріоритету 10 доступний у `$event->rpcRequest->getResponseObject()`.
69
+
70
+
## Що можна змінити
71
+
72
+
Нічого у відповіді — вона вже відправлена. Лише побічні дії.
73
+
74
+
## Приклади використання
75
+
76
+
### Аудит змін
77
+
78
+
```php
79
+
#[AsEventListener(RpcEvent::POST_RESPONSE)]
80
+
final class AuditListener
81
+
{
82
+
public function __construct(private AuditLog $audit, private ApiGroupContext $groups) {}
83
+
84
+
public function __invoke(RpcPostResponseEvent $event): void
85
+
{
86
+
$this->audit->record(
87
+
method: $event->service->name,
88
+
params: $event->rpcRequest->getParams(),
89
+
group: $this->groups->getGroup(),
90
+
);
91
+
}
92
+
}
93
+
```
94
+
95
+
### Інтеграція після відповіді
96
+
97
+
Відправити вебхук партнеру чи синхронізувати дані з CRM, не затримуючи клієнта. Для дуже довгих операцій краще передати роботу в чергу Symfony Messenger.
98
+
99
+
:::info
100
+
HTTP-запит Symfony у цей момент уже знято з `RequestStack`. Якщо потрібні його заголовки, беріть їх з `RequestCarrier` (`getCarrier()->getHttpRequest()` для `IRpcHttpCarrier`).
101
+
:::