0

我想在处理程序之外访问请求对象。

我想要实现的是有一个工厂类,它基于请求中的值,将设置一些类。

不幸的是,下面的代码(在工厂类中)没有提供正确的请求对象。

    public function __invoke(ContainerInterface $container, $requestedName, array $options = null, ServerRequestInterface $request): AbstractAttributeValidator
    {
        /** @var ServerRequestInterface $request */
        $request = $container->get(ServerRequestInterface::class);

我在文档中没有看到任何内容。

你能建议点什么吗?还是我应该以不同的方式解决问题?

4

2 回答 2

1

您不能将请求注入服务。容器不知道该请求。我不确定您实际上想要实现什么,但有一些解决方法。

例如,您可以创建一个中间件,将服务类注入其中,然后使用中间件将请求注入该服务类setRequest。但这感觉有点hacky。

我使用的另一个解决方法是添加一个MyService::doSomethingWithRequest(ServerRequestInterface $request). 这样,服务类可以在您从容器中获取请求后对其进行处理。

由于您需要一个请求,听起来您可能需要一个中间件并在其中执行一些逻辑而不是服务类。一个简单的例子可能是 身份验证中间件

但是,如果您描述您需要什么样的服务请求,这将有所帮助。

于 2019-07-12T05:10:46.693 回答
0

对于设计问题,最好不要将请求注入非处理程序服务。处理程序是一个单独负责处理请求的层。如果你需要对请求附带的参数做一些事情,你需要单独传递参数,而不是整个请求。

不过,如果您要修改整个请求/响应 - 对于身份验证标头、cookie、csrf 等,您应该对中间件模式感兴趣。PSR-15 中间件经过精心设计,专门用作请求/响应修饰符。Zend/Laminas 在 Expressive 和 Mezzio 解决方案中也支持它们。

于 2020-03-08T18:23:30.843 回答