如何在一个包内加载服务配置
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何在一个包内加载服务配置
由bundle创建的服务不在main中定义配置/ services.yaml
应用程序使用的文件,但在包本身中。本文解释了如何创建和加载这些bundle服务文件。
创建扩展类
为了加载服务配置,您必须为您的包创建一个依赖注入(DI)扩展。默认情况下,Extension类必须遵循这些约定(但稍后你将学习如何在需要时跳过它们):
- 它必须生活在
DependencyInjection
bundle的命名空间; - 它必须实现ExtensionInterface,这通常是通过扩展扩展类;
- 属性的名称等于bundle名称
包
后缀替换为扩展
(例如,AcmeBundle的Extension类将被调用AcmeExtension
而用于AcmeHelloBundle的将被调用AcmeHelloExtension
).
这是AcmeHelloBundle的扩展应该是这样的:
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php名称空间Acme\HelloBundle\DependencyInjection;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\扩展\扩展;类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的名称配置/包/
文件)。默认情况下,这是通过删除扩展
后缀并将类名转换为下划线(例如:AcmeHelloExtension
的DI别名为acme_hello
).
使用load ()
方法
在load ()
方法,将加载与此扩展相关的所有服务和参数。这个方法不获取实际的容器实例,而是一个副本。这个容器只有来自实际容器的参数。加载服务和参数后,副本将合并到实际容器中,以确保所有服务和参数也添加到实际容器中。
在load ()
方法,您可以使用PHP代码来注册服务定义,但如果您将这些定义放在配置文件中(使用YAML、XML或PHP格式)则更常见。
例如,假设您有一个名为services . xml
在资源/ config /
你的包目录,你的load ()
方法如下所示:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\DependencyInjection\加载程序\XmlFileLoader;使用ob娱乐下载\组件\配置\FileLocator;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){$加载程序=新XmlFileLoader ($容器,新FileLocator (__DIR__.“/ . . /资源/配置”));$加载程序->负载(“xml”);}
其他可用的加载器是YamlFileLoader
而且PhpFileLoader
.
通过配置更改服务
扩展也是为特定的包处理配置的类(例如,在配置/包/ < bundle_alias > .yaml
).欲了解更多有关资料,请参阅“如何创建一个包的友好配置”文章。
添加要编译的类
bundle可以提示Symfonyob娱乐下载它们的哪些类包含注释,以便在生成应用程序缓存时对它们进行编译,以提高整体性能。类中编译的带注释类的列表addAnnotatedClassesToCompile ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用应用程序\经理\UserManager;使用应用程序\跑龙套\重击者;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){/ /……$这->addAnnotatedClassesToCompile ([//你可以定义完全限定类名…“应用程序控制器\ \ \ \ DefaultController”,/ /……但是glob模式也被支持:“* *控制器包\ \ \ \”,/ /……]);}
请注意
如果某个类从其他类扩展而来,那么它的所有父类都会自动包含在要编译的类列表中。
使用Composer生成的类映射将模式转换为实际的类名称空间。因此,在使用这些模式之前,必须生成执行的完整类映射dump-autoload
作曲家的命令。
谨慎
类时,不能使用此技术__DIR__
或__FILE__
常量,因为它们的值将在从classes.php
文件。