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

编辑该页面

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

创建的服务包中定义的不主要配置/ 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
/ /……使用Acme\HelloBundle\DependencyInjection\UnconventionalExtensionClass;AcmeHelloBundle扩展{公共函数getContainerExtension(){返回UnconventionalExtensionClass ();}}

另外,当新的扩展类名不遵循命名约定,你也必须覆盖扩展::getAlias ()方法以返回正确的DI别名。DI别名是指包的容器(例如配置/包/文件)。默认情况下,这是通过删除扩展后缀,将类名转换为下划线(如。AcmeHelloExtensionDI别名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”);}

其他可用的装入器YamlFileLoaderPhpFileLoader

使用配置改变的服务

扩展也处理特定的配置包的类(例如配置配置/包/ < 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美元容器,ContainerBuilder美元构建器):无效{/ /加载XML, PHP或Yaml文件美元容器- >导入(“. . /配置/ services . xml”);/ /还可以添加或替换参数和服务美元容器- >参数()- >集(“acme_hello.phrase”,美元配置(“短语”]);如果(美元配置(“尖叫”){美元容器- >服务()- >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文件。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop