如何加载服务配置在一个包吗

编辑该页面

警告:你浏览的文档欧宝官网下载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文件)。默认情况下,这是通过删除扩展后缀,将类名转换为下划线(如。AcmeHelloExtensionDI别名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,PhpFileLoaderIniFileLoader

请注意

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文件。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。