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

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.7,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

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

在Syob娱乐下载mfony中,您会发现自己使用了许多服务。这些服务可以在应用程序/配置/应用程序的目录。但是,当您希望解耦该包以便在其他项目中使用时,您希望在包本身中包含服务配置。本文将教你如何做到这一点。

创建扩展类

为了加载服务配置,您必须为您的包创建一个依赖注入(DI)扩展。这个类有一些约定,以便自动检测。但是稍后您将看到如何将其更改为您自己的偏好。默认情况下,扩展必须遵守以下约定:

  • 它必须生活在DependencyInjectionbundle的命名空间;
  • 属性的名称等于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名称空间AcmeHelloBundleDependencyInjection使用ob娱乐下载组件HttpKernelDependencyInjection扩展使用ob娱乐下载组件DependencyInjectionContainerBuilderAcmeHelloExtension扩展扩展公共函数负载(数组配置, ContainerBuilder容器/ /……稍后您将在这里加载文件}}

手动注册扩展类

如果不遵循约定,您将不得不手动注册您的扩展。要做到这一点,您应该重写包:getContainerExtension ()方法返回扩展的实例:

1 2 3 4 5 6 7 8 9 10
/ /……使用AcmeHelloBundleDependencyInjectionUnconventionalExtensionClassAcmeHelloBundle扩展公共函数getContainerExtension()返回UnconventionalExtensionClass ();}}

由于新的Extension类名不遵循命名约定,您也应该重写扩展::getAlias ()以返回正确的DI别名。DI别名是用于引用容器中的bundle的名称应用程序/配置/ config.yml文件)。默认情况下,这是通过删除扩展后缀并将类名转换为下划线(例如:AcmeHelloExtension的DI别名为acme_hello).

使用load ()方法

load ()方法,将加载与此扩展相关的所有服务和参数。这个方法不获取实际的容器实例,而是一个副本。这个容器只有来自实际容器的参数。加载服务和参数后,副本将合并到实际容器中,以确保所有服务和参数也添加到实际容器中。

load ()方法,您可以使用PHP代码来注册服务定义,但更常见的是将这些定义放在配置文件中(使用Yaml、XML或PHP格式)。幸运的是,您可以使用扩展中的文件加载器!

例如,假设您有一个名为services . xml资源/配置你的包目录,你的load ()方法如下所示:

12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载组件DependencyInjection加载程序XmlFileLoader使用ob娱乐下载组件配置FileLocator/ /……公共函数负载(数组配置, ContainerBuilder容器加载程序XmlFileLoader (容器FileLocator (__DIR__“/ . . /资源/配置”));加载程序->负载(“xml”);}

其他可用的加载程序是YamlFileLoaderPhpFileLoader而且IniFileLoader

请注意

IniFileLoader只能用于加载参数,并且只能作为字符串加载它们。

谨慎

如果您删除了包含服务定义的默认文件(即。应用程序/配置/ services.yml),确保也将其从进口关键在应用程序/配置/ config.yml

通过配置更改服务

扩展也是为特定的包处理配置的类(例如,在应用程序/配置/ config.yml).欲了解更多有关资料,请参阅“如何创建一个包的友好配置”文章。

添加要编译的类

ob娱乐下载Symfony创造了一个巨大的classes.php文件,以聚合每个请求中使用的PHP类的内容。这减少了I/O操作,提高了应用程序性能。

方法还可以将它们自己的类添加到此文件中addClassesToCompile ()方法。定义要编译的类为其全限定类名的数组:

12 3 4 5 6 7 8 9 10 11 12 13 14
使用AppBundle经理UserManager使用AppBundle跑龙套重击者/ /……公共函数负载(数组配置, ContainerBuilder容器/ /……->addClassesToCompile (数组(UserManager::类,重击者::类,/ /……));}

请注意

如果某个类从其他类扩展而来,那么它的所有父类都会自动包含在要编译的类列表中。

注意这个技巧在某些情况下不能使用

  • 当类包含注释时,例如带有@Route注释和实体@ORM@Assert注释,因为从PHP反射中检索到的文件位置会发生变化;
  • 当类使用__DIR__而且__FILE__常量,因为它们的值将在从classes.php文件。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。