使用 Symfony 4.4,如果在请求中找到它,我想即时添加到我所有的路由参数。例如。对于用户 ID:
PUT | DELETE | POST mywebsite.com/users/{userid}/some-action
我可以在每次登录时添加我的用户 ID,但这有点麻烦。
所以我创建了一个服务:
//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);
}
}
当我在 POST/users/{userid}/some-action
上运行我的 postman 时,我得到了这个输出:
[
"media_type" => "application/json"
]
据我了解,symfony 路由参数 request attributes在我的处理器运行时尚未构建。
我应该怎么做才能使我的处理器访问属性 userid
?
最佳答案
检查 Symfony\Bridge\Monolog\Processor\RouteProcessor
是如何实现的这样做:
它被实现为一个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
}
在 KernelEvents::REQUEST
期间,它将所需的请求数据(包括请求参数,如果需要的话)添加到对象的内部状态,因此当处理器运行时,它可以访问来自内部 RouteProcessor::$routeData
,而不是直接来自请求。
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;
}
您可以修改此方法以适合自己,甚至可以直接使用此处理器(尽管它添加的数据多于您在问题中查找的数据)。
关于php - 如何从标记为 monolog.processor 的服务访问路由参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69154898/