php - 如何从标记为 monolog.processor 的服务访问路由参数?

标签 php symfony monolog

使用 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/

相关文章:

php - 使用 MonologBu​​ndle 自定义 HandlerWrapper

Symfony2 : __toString() must not throw an exception

php - DOMPDF - 将创建的 PDF 附加到电子邮件

php - 使用 PHP 更新 MySQL 数据库

session - 成功验证后 symfony2 安全 token /上下文丢失( session 正在运行)

php - 在 Controller 中使用爬虫

php - Monologger 中的 "channel"是什么?

php - 使用 MySQL LOAD_FILE() 将 XML 添加到列

php - 如何对小数进行四舍五入?

mongodb - MongoDb Doctrine Symfony 2 中的非规范化数据