如何在Zend Expressive 3中的Handler之外获取Request对象

时间:2019-07-11 11:33:04

标签: php php-7 zend-expressive

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

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

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

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

我在文档中什么都没看到。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

因为您需要一个请求,所以听起来您可能需要一个中间件,并在其中执行一些逻辑而不是服务类。一个简单的示例可能是authentication middleware

但是,如果您描述您需要哪种服务,这将会有所帮助。

答案 1 :(得分:0)

对于设计而言,最好不要将请求注入非处理程序服务中。处理程序是一个,它仅负责handlig请求。如果您需要对请求附带的参数进行处理,则需要仅传递参数,而不是整个请求。

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