rpc.post_response

← rpc.post_response

Ashterix

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 + :::