如何在一个包内加载服务配置
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何在一个包内加载服务配置
在Syob娱乐下载mfony中,您会发现自己使用了许多服务。这些服务可以在应用程序/配置/
应用程序的目录。但是,当您希望解耦该包以便在其他项目中使用时,您希望在包本身中包含服务配置。本文将教你如何做到这一点。
创建扩展类
为了加载服务配置,您必须为您的包创建一个依赖注入(DI)扩展。这个类有一些约定,以便自动检测。但是稍后您将看到如何将其更改为您自己的偏好。默认情况下,扩展必须遵守以下约定:
- 它必须生活在
DependencyInjection
bundle的命名空间; - 属性的名称等于bundle名称
包
后缀替换为扩展
(例如AppBundle的Extension类将被调用AppExtension
而用于AcmeHelloBundle的将被调用AcmeHelloExtension
).
扩展类应该实现ExtensionInterface,但通常您会简单地扩展扩展类:
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php名称空间Acme\HelloBundle\DependencyInjection;使用ob娱乐下载\组件\HttpKernel\DependencyInjection\扩展;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;类AcmeHelloExtension扩展扩展{公共函数负载(数组$配置, ContainerBuilder$容器){/ /……稍后您将在这里加载文件}}
手动注册扩展类
如果不遵循约定,您将不得不手动注册您的扩展。要做到这一点,您应该重写包:getContainerExtension ()方法返回扩展的实例:
1 2 3 4 5 6 7 8 9 10
/ /……使用Acme\HelloBundle\DependencyInjection\UnconventionalExtensionClass;类AcmeHelloBundle扩展包{公共函数getContainerExtension(){返回新UnconventionalExtensionClass ();}}
由于新的Extension类名不遵循命名约定,您也应该重写扩展::getAlias ()以返回正确的DI别名。DI别名是用于引用容器中的bundle的名称应用程序/配置/ config.yml
文件)。默认情况下,这是通过删除扩展
后缀并将类名转换为下划线(例如:AcmeHelloExtension
的DI别名为acme_hello
).
使用load ()
方法
在load ()
方法,将加载与此扩展相关的所有服务和参数。这个方法不获取实际的容器实例,而是一个副本。这个容器只有来自实际容器的参数。加载服务和参数后,副本将合并到实际容器中,以确保所有服务和参数也添加到实际容器中。
在load ()
方法,您可以使用PHP代码来注册服务定义,但更常见的是将这些定义放在配置文件中(使用Yaml、XML或PHP格式)。幸运的是,您可以使用扩展中的文件加载器!
例如,假设您有一个名为services . xml
在资源/配置
你的bundle目录,你的load方法看起来是这样的:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\DependencyInjection\加载程序\XmlFileLoader;使用ob娱乐下载\组件\配置\FileLocator;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){$加载程序=新XmlFileLoader ($容器,新FileLocator (__DIR__.“/ . . /资源/配置”));$加载程序->负载(“xml”);}
其他可用的加载程序是YamlFileLoader
,PhpFileLoader
而且IniFileLoader
.
请注意
的IniFileLoader
只能用于加载参数,并且只能作为字符串加载它们。
谨慎
如果您删除了包含服务定义的默认文件(即。应用程序/配置/ services.yml
),确保也将其从进口
关键在应用程序/配置/ config.yml
.
通过配置更改服务
扩展也是为特定的包处理配置的类(例如,在应用程序/配置/ config.yml
).欲了解更多有关资料,请参阅“如何创建一个包的友好配置”文章。
添加要编译的类
ob娱乐下载Symfony创造了一个巨大的classes.php
文件,以聚合每个请求中使用的PHP类的内容。这减少了I/O操作,提高了应用程序性能。
方法还可以将它们自己的类添加到此文件中addClassesToCompile ()
方法。定义要编译的类为其全限定类名的数组:
1 2 3 4 5 6 7 8 9 10 11
/ /……公共函数负载(数组$配置, ContainerBuilder$容器){/ /……$这->addClassesToCompile (数组(“AppBundle \ \经理\ \ UserManager”,“轰效用AppBundle \ \ \ \”,/ /……));}
请注意
如果某个类从其他类扩展而来,那么它的所有父类都会自动包含在要编译的类列表中。
注意这个技巧在某些情况下不能使用:
- 当类包含注释时,例如带有
@Route
注释和实体@ORM
或@Assert
注释,因为从PHP反射中检索到的文件位置会发生变化; - 当类使用
__DIR__
而且__FILE__
常量,因为它们的值将在从classes.php
文件。