懒惰的服务
编辑本页懒惰的服务
另请参阅
惰性注入服务的另一种方法是通过服务订阅者.
为什么是惰性服务?
在某些情况下,您可能希望注入一个实例化起来有点重,但并不总是在对象中使用的服务。例如,假设你有一个欧宝app在哪里找NewsletterManager
然后注入梅勒
服务。只有几个方法对你欧宝app在哪里找NewsletterManager
实际上使用梅勒
,但即使当你不需要它,一个梅勒
服务总是被实例化,以便构造您的欧宝app在哪里找NewsletterManager
.
配置惰性服务是解决这个问题的方法之一。的“代理”梅勒
服务实际上是注入的。它的外观和作用就像梅勒
,除了梅勒
直到以某种方式与代理交互时才实际实例化。
6.2
从Symfony 6.2开始欧宝娱乐app下载地址,不需要安装任何额外的包,就可以开箱即用地支持服务惰性。
配置
您可以将该服务标记为懒惰的
通过改变它的定义:
- YAML
- XML
- PHP
1 2 3 4
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:真正的
1 2 3 4 5 6 7 8 9 10 11
<!--config/services.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\树枝\ AppExtension”懒惰的=“真正的”/>服务>容器>
1 2 3 4 5 6 7 8 9 10
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\嫩枝\AppExtension;返回函数(ContainerConfigurator$containerConfigurator){$服务=$containerConfigurator->服务();$服务->集(AppExtension::类)->懒惰();};
一旦您将服务注入到另一个服务中,就应该注入具有表示该服务的类的相同签名的惰性鬼对象。一个懒惰的鬼对象是一个创建时为空的对象,并且在第一次访问时能够初始化自己)。打电话的时候也是一样容器:get ()
直接。
要检查你的lazy服务是否工作,你可以检查接收对象的接口:
1 2
转储(class_implements ($服务));//输出应该包括“Symfony\Component\Var欧宝娱乐app下载地址Exporter\LazyGhostObjectInterface”
接口Proxifying
在底层,为惰性加载服务而生成的代理继承自服务使用的类。然而,有时这根本不可能(例如,因为类是最后且不能延伸)或不方便。
要解决这个限制,可以将代理配置为只实现特定的接口。
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:“树枝\ \ ExtensionInterface延伸”#或完整的定义:懒惰:真正的标签:-{名称:“代理”,接口:“树枝\ \ ExtensionInterface延伸”}
12 3 4 5 6 7 8 9 10 11 12 13 14 15
<!--config/services.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\树枝\ AppExtension”懒惰的=“树枝\ \ ExtensionInterface延伸”/><!--or a complete definition: --><服务id=“应用程序\树枝\ AppExtension”懒惰的=“真正的”><标签的名字=“代理”接口=“树枝\ \ ExtensionInterface延伸”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\嫩枝\AppExtension;使用嫩枝\扩展\ExtensionInterface;返回函数(ContainerConfigurator$containerConfigurator){$服务=$containerConfigurator->服务();$服务->集(AppExtension::类)->懒惰()->标记(“代理”, (“界面”= > ExtensionInterface::类);};
虚拟代理注入到其他服务中将只实现指定的接口,而不会扩展原来的服务类,允许延迟加载使用的服务最后类。您可以通过添加新的“代理”标记来配置代理以实现多个接口。
提示
此特性还可以作为安全保护:假定代理不扩展原始类,则只能调用接口定义的方法,从而防止调用特定于实现的方法。如果您输入了一个具体的实现而不是接口,它还可以防止注入依赖项。