如何加载服务配置在一个包吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何加载服务配置在一个包吗
在Syob娱乐下载mfony中,您会发现自己使用多种服务。这些服务可以注册的应用程序/配置/
应用程序的目录。但当你想解耦束用于其他项目,你想要包括的服务配置包本身。本文将教你怎么做。
创建一个扩展类
为了负载服务配置,您必须创建一个依赖项注入(DI)扩展包。这门课有一些约定为了被自动检测到。但是以后你会看到如何改变它自己的偏好。默认情况下,扩展必须遵守以下约定:
- 住在
DependencyInjection
包的命名空间; - 的名称等于包名称
包
后缀所取代扩展
(如AppBundle的扩展类会调用AppExtension
和一个用于AcmeHelloBundle会叫AcmeHelloExtension
)。
扩展类应该实现ExtensionInterface,但通常你只会延长扩展类:
1 2 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 ();}}
因为新的扩展类名不遵循命名约定,你也应该覆盖扩展::getAlias ()返回正确的DI别名。DI别名是指包的容器(例如应用程序/配置/ config.yml
文件)。默认情况下,这是通过删除扩展
后缀,将类名转换为下划线(如。AcmeHelloExtension
DI别名acme_hello
)。
使用load ()
方法
在load ()
方法,与此有关的所有服务和参数扩展将被加载。这个方法没有得到实际的容器实例,但一个副本。这个容器只有参数与实际使用的容器。加载服务和参数后,将合并复制到实际的容器,确保所有服务和实际参数也添加到容器中。
在load ()
方法,您可以使用PHP代码来注册服务定义,但更常见的如果你把这些定义在配置文件(使用Yaml、XML或PHP格式)。幸运的是,您可以使用文件加载器扩展!
例如,假设您有一个文件services . xml
在资源/配置
目录你的包,你的负载方法看起来像:
1 2 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
文件。