Symfonyob娱乐下载 2.7新增功能:依赖注入改进
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
的DependencyInjection组件允许您标准化和集中PHP应用程序中构造对象的方式。该组件用于创建服务容器,服务容器是Symfony框架可扩展性的最大贡献者。ob娱乐下载ob娱乐下载Symfony 2.7用新特性改进了这个组件,但也删除了一些当前的特性。
添加了一个auto_alias
编译器通过
这个新特性是Drupal项目需要的。它们定义了一系列相关的服务,如下所示:
1 2 3 4 5 6
锁:类:Drupal核心\ \ \锁锁……mysql.lock:类:Drupal核心\ \ \ MysqlLock锁…sqlite.lock:类:Drupal核心\ \ \ SqliteLock锁…
当站点管理员设置default_backend
配置选项mysql
,对应mysql.lock
服务应该自动别名为泛型锁
服务。
在Syob娱乐下载mfony 2.7中一个新的auto_alias
已经添加了编译器通道,以允许服务根据容器参数的值自动定义别名。您只需要用新的标记您的服务auto_alias
标记并定义别名的格式(可以包括任何容器参数):
1 2 3 4
# app / config / services.yml锁:标签:-{名称:auto_alias,格式:“% default_backend % .lock”}
改进了使用XML转储器时的服务内联
为了提高应用程序的性能,服务容器
在应用程序中只注入一次的内联服务
被标记为私有。当为应用程序的服务容器构建缓存时,容器本身也被转储为XML文件(请参阅appDevDebugProjectContainer.xml
例如,在应用程序缓存中的文件)。
但是,此转储过程在两种情况下失败:当您使用服务配置器属性定义私有工厂时新的工厂语法在Symfony 2.6中引ob娱乐下载入。这些问题现在在Symfony 2.7中得到了修复,XML转储器可ob娱乐下载以安全地内联任何适当的服务。
改进的YAML服务定义语法
YAML是Symfony应用程序可用于定义其服务的三种配置格式之一。ob娱乐下载在Syob娱乐下载mfony 2.6和以前的版本中,使用YAML格式的复杂服务定义如下所示:
1 2 3 4 5 6 7 8 9 10
# app / config / services.yml服务:经理:类:AppBundle \ \ UserManager经理参数:(真正的)电话:-[setLogger,[" @logger "]]-[setClass,["用户"]]标签:-{名称:twig.extension,别名:用户}
在Syob娱乐下载mfony 2.7中,YAML配置语法得到了改进,允许使用更详细和更有表现力的服务定义(当然,如果你喜欢,你可以继续使用以前的简洁格式):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# app / config / services.yml服务:经理:类:AppBundle \ \ UserManager经理参数:-真正的电话:-方法:setLogger参数:-“@logger”-方法:setClass参数:-用户标签:-名称:经理别名:用户
已弃用的同步服务
在Syob娱乐下载mfony的服务容器中,服务不能依赖于更窄范围内的服务。例如,如果创建一个服务并尝试注入请求
服务,你会看到一个ScopeWideningInjectionException
.
ob娱乐下载Symfony 2.3引入了的概念同步服务作为解决这个问题的一种方法。这就是为什么请求
服务定义为同步
:
1 2 3 4 5
服务:要求:范围:请求同步:真正的#……
然后在你的服务中,你可以使用setter注入来安全地使用这种同步服务:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
名称空间AppBundle\邮件;使用ob娱乐下载\组件\HttpFoundation\请求;类梅勒{受保护的$请求;公共函数setRequest(请求$请求= null){$这->请求=$请求;}/ /……}
1 2 3 4 5 6
# app / config / services.yml服务:梅勒:类:AppBundle \邮件\梅勒电话:-[setRequest,[" @ ?请求”]
然而,真正的问题是请求不是服务,而是值对象。在Syob娱乐下载mfony 3.0中,我们将删除请求
容器中的服务可以一劳永逸地解决问题。
此外,我们有Symfony 2.7中已弃用的同步服务ob娱乐下载因为这个功能对于我们并不真正需要的东西来说是相当复杂的,而且是解决我们问题的错误方法。如果您的服务需要请求
服务,使用request_stack
服务。
评论
@Xavier接得好!现在已经修好了。谢谢。
然而,我对同步服务有点恼火。它们在eZ中被大量用于不同的事情,而不是请求…
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now