Usando Symfony 4.4, me gustaría agregar sobre la marcha a todos mis parámetros de ruta si se encuentran en la solicitud. Por ejemplo, para la identificación de usuario:
PUT | DELETE | POST mywebsite.com/users/{userid}/some-actionPodría agregar mis identificaciones de usuario cada vez que inicie sesión, pero es un poco engorroso.
Así que creé un servicio:
//src/ // |__Services/ // |___UserProcessor.php use Monolog\Processor\ProcessorInterface; use Symfony\Component\HttpFoundation\RequestStack; // In my config.yaml this monolog.processor final class UserProcessor implements ProcessorInterface { private RequestStack $requestStack; public function __construct(RequestStack $requestStack) { $this->requestStack = $requestStack; } public function __invoke(array $record): array { dd($this->requestStack->getMasterRequest()->attributes); } } Cuando ejecuto mi cartero en POST /users/{userid}/some-action obtengo este resultado:
[ "media_type" => "application/json" ]Según tengo entendido, los atributos de solicitud de parámetros de ruta de Symfony aún no se crean en el momento en que se ejecuta mi procesador.
¿Qué debo hacer para que mi procesador acceda al atributo ID de userid ?
Comprueba cómo lo hace Symfony\Bridge\Monolog\Processor\RouteProcessor :
Está implementado como EventSubscriber
class RouteProcessor implements EventSubscriberInterface, ResetInterface { private $routeData; private $includeParams; public function __construct(bool $includeParams = true) { $this->includeParams = $includeParams; $this->reset(); } public static function getSubscribedEvents(): array { return [ KernelEvents::REQUEST => ['addRouteData', 1], KernelEvents::FINISH_REQUEST => ['removeRouteData', 1], ]; } // rest of the implementation } Durante KernelEvents::REQUEST , agrega los datos de solicitud necesarios (incluidos los parámetros de solicitud, si así se desea) al estado interno del objeto, de modo que cuando se ejecuta el procesador puede acceder a los datos del RouteProcessor::$routeData , y no de la solicitud directamente.
public function addRouteData(RequestEvent $event) { if ($event->isMainRequest()) { $this->reset(); } $request = $event->getRequest(); if (!$request->attributes->has('_controller')) { return; } $currentRequestData = [ 'controller' => $request->attributes->get('_controller'), 'route' => $request->attributes->get('_route'), ]; if ($this->includeParams) { $currentRequestData['route_params'] = $request->attributes->get('_route_params'); } $this->routeData[spl_object_id($request)] = $currentRequestData; }Puede modificar este enfoque para que se adapte a usted, o incluso simplemente usar este procesador directamente (aunque agrega más datos de los que está buscando en su pregunta).