rpc.request

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 за клієнтом);
  • збір статистики використання застарілих методів;
  • перевірка додаткових умов доступу до методу (роль, тариф клієнта).