懒惰的服务
编辑本页懒惰的服务
另请参阅
惰性注入服务的另一种方法是通过服务订阅者.
为什么是惰性服务?
在某些情况下,您可能希望注入一个实例化起来有点重,但并不总是在对象中使用的服务。例如,假设你有一个欧宝平台是合法的吗NewsletterManager
然后注入梅勒
服务。只有几个方法对你欧宝平台是合法的吗NewsletterManager
实际上使用梅勒
,但即使当你不需要它,一个梅勒
服务总是被实例化,以便构造您的欧宝平台是合法的吗NewsletterManager
.
配置惰性服务是解决这个问题的方法之一。的“代理”梅勒
服务实际上是注入的。它的外观和作用就像梅勒
,除了梅勒
直到以某种方式与代理交互时才实际实例化。
6.2
从Symfony 6.2开始ob娱乐下载,您不需要安装任何包(例如:ob娱乐下载symfony / proxy-manager-bridge
),以便使用惰性服务实例化。
配置
您可以将该服务标记为懒惰的
通过改变它的定义:
- YAML
- XML
- PHP
1 2 3 4
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:真正的
一旦您将服务注入到另一个服务中,就应该注入具有表示该服务的类的相同签名的惰性鬼对象。一个懒惰的鬼对象是一个创建时为空的对象,并且在第一次访问时能够初始化自己)。打电话的时候也是一样容器:get ()
直接。
要检查你的lazy服务是否工作,你可以检查接收对象的接口:
1 2
转储(class_implements ($服务));//输出应该包括“Symfony\Component\Varob娱乐下载Exporter\LazyGhostObjectInterface”
接口Proxifying
在底层,为惰性加载服务而生成的代理继承自服务使用的类。然而,有时这根本不可能(例如,因为类是最后且不能延伸)或不方便。
要解决这个限制,可以将代理配置为只实现特定的接口。
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:“树枝\ \ ExtensionInterface延伸”#或完整的定义:懒惰:真正的标签:-{名称:“代理”,接口:“树枝\ \ ExtensionInterface延伸”}
虚拟代理注入到其他服务中将只实现指定的接口,而不会扩展原来的服务类,允许延迟加载使用的服务最后类。您可以通过添加新的“代理”标记来配置代理以实现多个接口。
提示
此特性还可以作为安全保护:假定代理不扩展原始类,则只能调用接口定义的方法,从而防止调用特定于实现的方法。如果您输入了一个具体的实现而不是接口,它还可以防止注入依赖项。