Php 如何在Zend Expressive 3中获取处理程序外部的请求对象

Php 如何在Zend Expressive 3中获取处理程序外部的请求对象,php,php-7,mezzio,Php,Php 7,Mezzio,我想访问处理程序外部的请求对象 我试图实现的是,有一个工厂类,它基于来自请求的值,将设置一些类 不幸的是,下面的代码(在工厂类中)没有提供正确的请求对象 public function __invoke(ContainerInterface $container, $requestedName, array $options = null, ServerRequestInterface $request): AbstractAttributeValidator {

我想访问处理程序外部的请求对象

我试图实现的是,有一个工厂类,它基于来自请求的值,将设置一些类

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

    public function __invoke(ContainerInterface $container, $requestedName, array $options = null, ServerRequestInterface $request): AbstractAttributeValidator
    {
        /** @var ServerRequestInterface $request */
        $request = $container->get(ServerRequestInterface::class);
我没有在文档中看到任何东西


你能建议点什么吗?或者我应该以不同的方式处理问题吗?

您不能将请求注入到服务中。容器不知道该请求。我不确定你到底想实现什么,但有一些变通办法

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

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

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


但是,如果您描述在什么类型的服务中需要请求,这会有所帮助。

对于设计问题,最好不要将请求注入到非处理程序服务中。Handler是一个,do单独负责handlig请求。如果您需要对请求附带的参数执行某些操作,则需要单独传递参数,而不是整个请求


尽管如此,如果您要修改整个请求/响应(针对身份验证头、cookie、csrf等),您应该对中间件模式感兴趣。PSR-15中间件设计良好,专门用作请求/响应修改器。Zend/Laminas在Expressive和Mezzio解决方案中也支持它们。

(我是Zend的新手),但您不能在参数中自动连接(ServerRequestInterface$request)吗?不太可能。Zend ServiceManager以这种方式调用工厂
$factory($this->creationContext,$resolvedName,$options)
,因此没有地方放置其他参数。您能更具体一点吗?你为什么需要这个?不久前我遇到了类似的情况。我当时正在开发一个混合应用程序(既有zend expressive,也有遗留代码访问文件夹/index.php)。我通过“模拟”zend expressive工作流来创建相同的工作流。该逻辑类似于zend expressive config目录(containter.php和pipeline.php)。基于当前路径(路径的第一段),我想在工厂中构建一些服务/存储库,这些服务/存储库将被注入到处理程序中。我想我找到了一些解决方案,在一家工厂里,我从容器中获得了UrlHelper,这给了我匹配的路径。