如何加载服务配置在一个包吗
编辑该页面如何加载服务配置在一个包吗
创建的服务包中定义的不主要配置/ services.yaml
文件使用的应用程序包本身。这篇文章解释了如何使用包创建和加载服务文件目录结构。
创建一个扩展类
为了负载服务配置,您必须创建一个依赖项注入(DI)扩展包。默认情况下,扩展类必须遵循这些约定(但之后,您将了解如何跳过他们如果需要):
- 住在
DependencyInjection
包的命名空间; - 它必须实现ExtensionInterface通常通过扩展实现的扩展类;
- 的名称等于包名称
包
后缀所取代扩展
(如AcmeBundle的扩展类会调用AcmeExtension
和一个用于AcmeHelloBundle会叫AcmeHelloExtension
)。
这就是扩展的AcmeHelloBundle应该看起来像:
1 2 3 4 5 6 7 8 9 10 11 12 13
/ / src / DependencyInjection / AcmeHelloExtension.php名称空间Acme\HelloBundle\DependencyInjection;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\扩展\扩展;类AcmeHelloExtension扩展扩展{公共函数负载(数组美元配置,ContainerBuilder美元容器){/ /……你以后在这里加载文件}}
手动注册一个扩展类
不遵循惯例时,您必须手动注册您的扩展。要做到这一点,你应该覆盖包:getContainerExtension ()扩展的方法返回实例:
1 2 3 4 5 6 7 8 9 10 11
/ /……使用Acme\HelloBundle\DependencyInjection\UnconventionalExtensionClass;使用ob娱乐下载\组件\DependencyInjection\扩展\ExtensionInterface;类AcmeHelloBundle扩展包{公共函数getContainerExtension():哦?ExtensionInterface{返回新UnconventionalExtensionClass ();}}
另外,当新的扩展类名不遵循命名约定,你也必须覆盖扩展::getAlias ()方法以返回正确的DI别名。DI别名是指包的容器(例如配置/包/
文件)。默认情况下,这是通过删除扩展
后缀,将类名转换为下划线(如。AcmeHelloExtension
DI别名acme_hello
)。
使用load ()
方法
在load ()
方法,与此有关的所有服务和参数扩展将被加载。这个方法没有得到实际的容器实例,但一个副本。这个容器只有参数与实际使用的容器。加载服务和参数后,将合并复制到实际的容器,确保所有服务和实际参数也添加到容器中。
在load ()
方法,您可以使用PHP代码来注册服务定义,但更常见的如果你把这些定义在配置文件(使用YAML、XML或PHP格式)。
例如,假设您有一个文件services . xml
在配置/
目录你的包,你的load ()
方法看起来像:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\DependencyInjection\加载程序\XmlFileLoader;/ /……公共函数负载(数组美元配置,ContainerBuilder美元容器){美元加载程序=新XmlFileLoader (美元容器,新FileLocator (__DIR__。“/ . . / . . /配置”));美元加载程序- >负载(“xml”);}
其他可用的装入器YamlFileLoader
和PhpFileLoader
。
使用配置改变的服务
扩展也处理特定的配置包的类(例如配置配置/包/ < bundle_alias > .yaml
)。阅读更多关于它,看到“如何创建友好的配置包吗”文章。
直接在你的包类加载服务
6.1
的AbstractBundle
类是在Symfony 6.1中引入的。ob娱乐下载
或者,您可以直接在包类定义和加载服务的配置,而不是创建一个特定的扩展
类。你可以通过扩展AbstractBundle和定义loadExtension ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ /……使用ob娱乐下载\组件\DependencyInjection\加载程序\配置器\ContainerConfigurator;使用ob娱乐下载\组件\HttpKernel\包\AbstractBundle;类AcmeHelloBundle扩展AbstractBundle{公共函数loadExtension(数组美元配置,ContainerConfigurator美元containerConfigurator,ContainerBuilder美元containerBuilder):无效{/ /加载XML, PHP或Yaml文件美元containerConfigurator- >导入(“. . /配置/ services . xml”);/ /还可以添加或替换参数和服务美元containerConfigurator- >参数()- >集(“acme_hello.phrase”,美元配置(“短语”]);如果(美元配置(“尖叫”){美元containerConfigurator- >服务()- >get (“acme_hello.printer”)- >类(ScreamingPrinter::类);}}}
这种方法类似于工作扩展::负载()
方法,但它使用新的API定义和进口服务配置。
请注意
相反美元配置
参数扩展::负载()
,美元配置
参数已经合并和处理的AbstractBundle
。
请注意
的loadExtension ()
只有在编译时。
添加类编译
包提示Symfony的这类可以包含ob娱乐下载注释,所以他们编译时生成应用程序缓存来提高整体性能。定义注释中编译的类的列表addAnnotatedClassesToCompile ()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13
公共函数负载(数组美元配置,ContainerBuilder美元容器){/ /……美元这- >addAnnotatedClassesToCompile ([/ /您可以定义的完全限定类名…“应用程序控制器\ \ \ \ DefaultController”,/ /……但是一滴模式也支持:“* *控制器包\ \ \ \”,/ /……]);}
请注意
如果有些类扩展了从其他类,其所有的父母都是自动包含在编译的类列表。
模式转换成实际的类名称空间使用生成的classmap作曲家。因此,在使用这些模式之前,您必须生成完整的classmap执行dump-autoload
命令的作曲家。
谨慎
这种技术时不能使用这些类来编译使用__DIR__
或__FILE__
常数,因为它们的值将改变当加载这些类的classes.php
文件。