rpc.request
Назва події
rpc.request
Константа
RpcEvent::REQUEST
Клас
RpcRequestEvent
Властивості
RpcRequest $rpcRequest
Вбудовані лістенери
немає
Перша RPC-подія запиту: генерується після розбору JSON, перевірки токена й версії jsonrpc, але до перевірки кешу і виклику методу.
Коли генерується
- Одиночний HTTP-запит і виклик з консолі — один раз.
- Batch: для кожного елемента. У процесному режимі — у дочірньому процесі, а не в батьківському.
- Notifications і
$rpc.callback— один раз при прийомі; під час відкладеного виконання методу повторно не генерується. - Виклики через
RpcExecutor(адаптери REST, MCP) — для кожного запиту.
Не генерується для повідомлень з Symfony Messenger, для запитів прогріву кешу і для запитів, відхилених раніше (недійсний JSON, помилка токена).
Що можна змінити
- Присвоєння нового
$event->rpcRequestні на що не впливає — обробник працює з власним посиланням на запит. - Змінювати сам об'єкт запиту можна.
$event->rpcRequest->setError($exception)змушує запит завершитися помилкою ще до виклику методу (перевіряється наrpc.pre_execute). На кешовану відповідь і на прийом notifications/callback це не впливає. - Виняток з лістенера повертає клієнту помилку.
Приклади використання
Трасування
Прив'язати запит до ідентифікатора трасування — rayId зі спеціальних параметрів або власного заголовка:
#[AsEventListener(RpcEvent::REQUEST)]
final class TraceListener
{
public function __construct(private LoggerInterface $logger) {}
public function __invoke(RpcRequestEvent $event): void
{
$request = $event->rpcRequest;
$this->logger->info('rpc.request', [
'method' => $request->getMethod(),
'id' => $request instanceof RpcNotificationRequest ? null : $request->getId(),
'ray_id' => $request->getRpcParams()?->getRayId(),
'version' => $request->apiVersion,
]);
}
}
Технічне обслуговування
Тимчасово відхиляти виклики окремих методів (наприклад, на час міграції):
#[AsEventListener(RpcEvent::REQUEST)]
final class MaintenanceListener
{
public function __construct(private FeatureFlags $flags) {}
public function __invoke(RpcRequestEvent $event): void
{
if ($this->flags->isFrozen($event->rpcRequest->getMethod())) {
$event->rpcRequest->setError(new RpcLogicException('Method is temporarily unavailable'));
}
}
}
Інші ідеї
- лічильник викликів методів (rate limiting за клієнтом);
- збір статистики використання застарілих методів;
- перевірка додаткових умов доступу до методу (роль, тариф клієнта).