如何在一个包内加载服务配置
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何在一个包内加载服务配置
在Syob娱乐下载mfony中,您会发现自己使用了许多服务。这些服务可以在应用程序/配置/
应用程序的目录。但是,当您希望解耦该包以便在其他项目中使用时,您希望在包本身中包含服务配置。本文将教你如何做到这一点。
创建扩展类
为了加载服务配置,您必须为您的包创建一个依赖注入(DI)扩展。这个类有一些约定,以便自动检测。但是稍后您将看到如何将其更改为您自己的偏好。默认情况下,扩展必须遵守以下约定:
- 它必须生活在
DependencyInjection
bundle的命名空间; - 属性的名称等于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名称空间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的名称应用程序/配置/ 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娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\DependencyInjection\加载程序\XmlFileLoader;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){$加载程序=新XmlFileLoader ($容器,新FileLocator (__DIR__.“/ . . /资源/配置”));$加载程序->负载(“xml”);}
其他可用的加载程序是YamlFileLoader
,PhpFileLoader
而且IniFileLoader
.
请注意
的IniFileLoader
只能用于加载参数,并且只能作为字符串加载它们。
谨慎
如果您删除了包含服务定义的默认文件(即。应用程序/配置/ services.yml
),确保也将其从进口
关键在应用程序/配置/ config.yml
.
通过配置更改服务
扩展也是为特定的包处理配置的类(例如,在应用程序/配置/ config.yml
).欲了解更多有关资料,请参阅“如何创建一个包的友好配置”文章。
添加要编译的类
3.3
不鼓励使用这种技术addClassesToCompile ()
方法在Symfony 3.3中已弃用,因为现代PHob娱乐下载P版本不再需要它。
ob娱乐下载Symfony创造了一个巨大的classes.php
文件,以聚合每个请求中使用的PHP类的内容。这减少了I/O操作,提高了应用程序性能。
3.2
的addAnnotatedClassesToCompile ()
方法是在Symfony 3.2中引入的。ob娱乐下载
方法还可以将它们自己的类添加到此文件中addClassesToCompile ()
而且addAnnotatedClassesToCompile ()
方法(两者的工作方式相同,但第二种方法用于包含PHP注释的类)。类提供了这些方法扩展
类从HttpKernel组件。定义要编译的类为其全限定类名的数组:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用AppBundle\经理\UserManager;使用AppBundle\跑龙套\重击者;使用ob娱乐下载\组件\HttpKernel\DependencyInjection\扩展;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){/ /……//该方法不能编译包含PHP注释的类$这->addClassesToCompile ([UserManager::类,重击者::类,/ /……]);//只添加包含PHP注释的类$这->addAnnotatedClassesToCompile ([“控制器AppBundle \ \ \ \ DefaultController”,/ /……]);}
请注意
如果某个类从其他类扩展而来,那么它的所有父类都会自动包含在要编译的类列表中。
3.2
在Symfony 3.2中引入了使用模式添加类进行编译的选项。ob娱乐下载
要编译的类也可以使用文件路径模式添加:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\HttpKernel\DependencyInjection\扩展;/ /……公共函数负载(数组$配置, ContainerBuilder$容器){/ /……$这->addClassesToCompile ([“* *包经理\ \ \ \”,/ /……]);$这->addAnnotatedClassesToCompile ([“* *控制器包\ \ \ \”,/ /……]);}
使用Composer生成的类映射将模式转换为实际的类名称空间。因此,在使用这些模式之前,必须生成执行的完整类映射dump-autoload
作曲家的命令。
谨慎
类时,不能使用此技术__DIR__
或__FILE__
常量,因为它们的值将在从classes.php
文件。