懒惰的服务

编辑本页

懒惰的服务

另请参阅

惰性注入服务的另一种方法是通过服务订阅者

为什么是惰性服务?

在某些情况下,您可能希望注入一个实例化起来有点重,但并不总是在对象中使用的服务。例如,假设你有一个欧宝平台是合法的吗NewsletterManager然后注入梅勒服务。只有几个方法对你欧宝平台是合法的吗NewsletterManager实际上使用梅勒,但即使当你不需要它,一个梅勒服务总是被实例化,以便构造您的欧宝平台是合法的吗NewsletterManager

配置惰性服务是解决这个问题的方法之一。的“代理”梅勒服务实际上是注入的。它的外观和作用就像梅勒,除了梅勒直到以某种方式与代理交互时才实际实例化。

谨慎

Lazy服务不支持最后类,但您可以使用接口Proxifying要绕过这个限制。

在8.0之前的PHP版本中,惰性服务不支持内置PHP类的参数默认值(例如。PDO).

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延伸”

虚拟代理注入到其他服务中将只实现指定的接口,而不会扩展原来的服务类,允许延迟加载使用的服务最后类。您可以通过添加新的“代理”标记来配置代理以实现多个接口。

提示

此特性还可以作为安全保护:假定代理不扩展原始类,则只能调用接口定义的方法,从而防止调用特定于实现的方法。如果您输入了一个具体的实现而不是接口,它还可以防止注入依赖项。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop