我想在处理程序之外访问请求对象。
我想要实现的是拥有一个工厂类,该工厂类基于请求中的值来设置一些类。
不幸的是,下面的代码(在工厂类中)没有提供适当的请求对象。
public function __invoke(ContainerInterface $container, $requestedName, array $options = null, ServerRequestInterface $request): AbstractAttributeValidator
{
/** @var ServerRequestInterface $request */
$request = $container->get(ServerRequestInterface::class);
我在文档中什么都没看到。
您能建议点什么吗?还是应该以不同的方式解决问题?
答案 0 :(得分:0)
您无法将请求注入服务。容器不知道该请求。我不确定您实际上要实现什么,但是有解决方法。
例如,您可以创建一个中间件,将服务类注入其中,并使用setRequest
中间件将请求注入该服务类中。但这感觉有点hacky。
我使用的另一个解决方法是添加一个MyService::doSomethingWithRequest(ServerRequestInterface $request)
。这样,服务类就可以在从容器中获取请求之后执行请求。
因为您需要一个请求,所以听起来您可能需要一个中间件,并在其中执行一些逻辑而不是服务类。一个简单的示例可能是authentication middleware。
但是,如果您描述您需要哪种服务,这将会有所帮助。
答案 1 :(得分:0)
对于设计而言,最好不要将请求注入非处理程序服务中。处理程序是一个层,它仅负责handlig请求。如果您需要对请求附带的参数进行处理,则需要仅传递参数,而不是整个请求。
尽管如此,如果您要修改整个请求/响应-对于身份验证标头,cookie,csrf等,您应该对中间件模式感兴趣。 PSR-15中间件经过精心设计,专门用作请求/响应修饰符。 Zend / Laminas也在Expressive和Mezzio解决方案中为它们提供支持。