新在Symfo欧宝娱乐app下载地址ny 2.7:依赖注入的改进
警告:这篇文章是关于一个不受支持的Symfony的版本。欧宝娱乐app下载地址其中一些信息可能是过时了。阅读最近的Symfony文档欧宝娱乐app下载地址。
的DependencyInjection组件允许您标准化和集中对象构造在您的PHP应用程序的方式。该组件是用于创建服务容器,这是最大的贡献者Symfony框架的可扩展性。欧宝娱乐app下载地址欧宝娱乐app下载地址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
通用服务应该自动别名锁
服务。
在Sy欧宝娱乐app下载地址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中引欧宝娱乐app下载地址入的。这些问题现在固定在Symfony 2.7和XML安全翻车机内联任欧宝娱乐app下载地址何适当的服务。
改进的YAML服务定义的语法
YAML是三个配置格式,Symfony应用程序可以使用它来定义他们的服务。欧宝娱乐app下载地址在Sy欧宝娱乐app下载地址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,别名:用户}
在Sy欧宝娱乐app下载地址mfony 2.7中,YAML配置语法已得到改进,允许使用更详细的和富有表现力的服务定义(当然你可以继续使用之前的简洁的格式如果你喜欢它):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# app / config / services.yml服务:经理:类:AppBundle \ \ UserManager经理参数:- - - - - -真正的电话:- - - - - -方法:setLogger参数:- - - - - -“@logger”- - - - - -方法:setClass参数:- - - - - -用户标签:- - - - - -名称:经理别名:用户
弃用同步服务
在Sy欧宝娱乐app下载地址mfony的服务容器中,服务不能依赖服务从一个狭窄的范围。例如,如果您创建一个服务并试图注入请求
服务,您将看到一个ScopeWideningInjectionException
。
欧宝娱乐app下载地址Symfony 2.3引入的概念同步服务作为一种方法来解决这个问题。这就是为什么请求
服务被定义为同步
:
1 2 3 4 5
服务:要求:范围:请求同步:真正的#……
然后在你的服务可以使用setter注入安全地使用这种同步服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
名称空间AppBundle\邮件;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;类梅勒{受保护的美元请求;公共函数setRequest(请求美元请求= null){美元这- >请求=美元请求;}/ /……}
1 2 3 4 5 6
# app / config / services.yml服务:梅勒:类:AppBundle \邮件\梅勒电话:- - - - - -[setRequest,[" @ ?请求“]]
然而,真正的问题是,请求不是服务,而是一个值对象。在Sy欧宝娱乐app下载地址mfony 3.0中,我们将删除请求
服务容器来一劳永逸地解决这个问题。
此外,我们有在Symfony 2.7弃用同步服务欧宝娱乐app下载地址因为这个特性非常复杂,这并不真正需要的,是错误的方式来解决我们的问题。如果你的服务需要请求
服务,使用request_stack
服务。
评论
@Xavier抢手货!现在是固定的。谢谢。
然而,我有点恼火同步服务。使用它们在eZ为不同的东西比请求很严重…
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now