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

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

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

由bundle创建的服务不在main中定义配置/ services.yaml应用程序使用的文件,但在包本身中。本文解释了如何使用bundle目录结构创建和加载服务文件。

创建扩展类

为了加载服务配置,您必须为您的包创建一个依赖注入(DI)扩展。默认情况下,Extension类必须遵循这些约定(但稍后你将学习如何在需要时跳过它们):

  • 它必须生活在DependencyInjectionbundle的命名空间;
  • 它必须实现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名称空间AcmeHelloBundleDependencyInjection使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件HttpKernelDependencyInjection扩展AcmeHelloExtension扩展扩展公共函数负载(数组配置, ContainerBuilder容器/ /……稍后您将在这里加载文件}}

手动注册扩展类

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

1 2 3 4 5 6 7 8 9 10
/ /……使用AcmeHelloBundleDependencyInjectionUnconventionalExtensionClassAcmeHelloBundle扩展公共函数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
使用欧宝娱乐app下载地址组件配置FileLocator使用欧宝娱乐app下载地址组件DependencyInjection加载程序XmlFileLoader/ /……公共函数负载(数组配置, ContainerBuilder容器加载程序XmlFileLoader (容器FileLocator (__DIR__“/ . . /资源/配置”));加载程序->负载(“xml”);}

其他可用的加载器是YamlFileLoader而且PhpFileLoader

通过配置更改服务

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

添加要编译的类

bundle可以提示Symfony欧宝娱乐app下载地址它们的哪些类包含注释,以便在生成应用程序缓存时对它们进行编译,以提高整体性能。类中编译的带注释类的列表addAnnotatedClassesToCompile ()方法:

12 3 4 5 6 7 8 9 10 11 12 13
公共函数负载(数组配置, ContainerBuilder容器/ /……->addAnnotatedClassesToCompile ([//你可以定义完全限定类名…“应用程序控制器\ \ \ \ DefaultController”/ /……但是glob模式也被支持:“* *控制器包\ \ \ \”/ /……]);}

请注意

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

使用Composer生成的类映射将模式转换为实际的类名称空间。因此,在使用这些模式之前,必须生成执行的完整类映射dump-autoload作曲家的命令。

谨慎

类时,不能使用此技术__DIR____FILE__常量,因为它们的值将在从classes.php文件。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode