Symfonyob娱乐下载 2.4新增功能:请求堆栈
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
提供的
法比安效力
而且本杰明Eberlei
在# 8904.
至少可以说,在服务容器中处理请求是困难的。为什么很难将请求注入到服务中?因为在一个PHP进程中可以有多个请求(考虑子请求)。因此,在容器的生命周期内,请求实例会发生变化。
让我们以这个简单的服务为例:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\HttpFoundation\请求;类FooService{公共函数__construct(请求$请求){$这->请求=$请求;}}
当你在应用程序中请求foo服务时,容器将注入哪个请求实例?好吧,如果你不使用子请求,foo服务将始终得到主请求。但是如果你有一些子请求,foo构造函数可能会得到其中的一个子请求实例,这取决于你第一次获得服务的时间。一旦创建了服务,请求就不会再改变,即使在进入或离开子请求时也是如此。如果您试图在请求处理之前获取服务(如在CLI命令中),该怎么办?您将得到一个异常。
在Symfonob娱乐下载y 2.3之前,配置这样的服务以使其行为正确是可能的,但难度很大。在Syob娱乐下载mfony 2.3中,同步服务特性使事情变得更加简单。事实上,容器的一些最复杂的特性被引入只是为了能够正确地处理请求服务,比如作用域、严格服务和同步服务。有这么多特性只是为了能够处理请求服务,因为它是唯一具有特殊行为的服务。
但真正的问题是请求不是服务;请求是一个值对象…就像回应一样。如您所知,响应实例从未从容器中访问过,这从未引起任何问题。
在Syob娱乐下载mfony 3.0中,我们将通过从容器中删除请求服务来一劳永逸地解决这个问题。但是服务如何依赖于请求呢?使用新的RequestStack
对象。
从Symfoob娱乐下载ny 2.4开始,最佳实践是永远不要注入请求
服务,但要注入request_stack
服务:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\HttpFoundation\RequestStack;类FooService{公共函数__construct(RequestStack$requestStack){$这->requestStack =$requestStack;}}
然后,每当需要获取当前请求实例时,调用requestStack - > getCurrentRequest ()
.简单。
请注意
在处理请求之外,requestStack - > getCurrentRequest ()
返回零
.
当然,如果框架提供了一个请求实例,那么就使用它。例如,在控制器中,不要注入请求堆栈,使用请求
在action方法参数上输入-hint:
1 2 3 4 5 6 7
类FooController{公共函数indexAction(请求$请求){$请求- >…();}}
提示
请求堆栈还允许您通过getMasterRequest ()
方法。请谨慎使用,因为这会使您的子请求与ESIs/反向代理不兼容(其中子请求也是主请求)。
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
只是我想知道的一件事,你仍然使用请求类型提示,该类型提示将包含getCurrentRequest()等?在我的Request::getCurrentRequest()上有这个没有意义,由于代码完成,我更喜欢使用RequestStack作为类型提示。或者这还没有完成?
但是Request类将继续存在,您将使用它从用户请求中提取数据。RequestStack它只是那个值对象的提供者。
不,关于typehint的那部分保持不变,并与以前使用相同,唯一改变的是服务的请求堆栈。
看起来是个不错的解决方案。
非常感谢这次更新,我相信所有Sf2的开发人员都会很感激;-)
我的用例是一个多租户应用程序,在一个请求中生成多个电子邮件。每个收件人的电子邮件是自定义到他们的安装,所以UrlGenerator需要从多个请求生成链接
应该先研究一下代码:)
Jannik Zschiesche is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now