懒惰的服务

编辑本页

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

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

懒惰的服务

另请参阅

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

为什么是惰性服务?

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

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

谨慎

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

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

安装

为了使用惰性服务实例化,需要安装欧宝娱乐app下载地址symfony / proxy-manager-bridge包:

1
Composer需要symfony欧宝娱乐app下载地址/proxy-manager-bridge

配置

您可以将该服务标记为懒惰的通过改变它的定义:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:真正的

一旦您将服务注入到另一个服务中,就会生成一个虚拟服务代理应该使用表示服务的类的相同签名进行注入。打电话的时候也是一样容器:get ()直接。

一旦你尝试与服务交互(例如调用它的一个方法),实际的类就会被实例化。

要检查你的代理是否工作,你可以检查接收对象的接口:

1 2
转储(class_implements (服务));//输出应该包括"ProxyManager\Proxy\LazyLoadingInterface"

请注意

如果不安装ProxyManager桥时,容器将跳过懒惰的标记并像通常那样直接实例化服务。

接口Proxifying

在底层,为惰性加载服务而生成的代理继承自服务使用的类。然而,有时这根本不可能(例如,因为类是最后且不能延伸)或不方便。

要解决这个限制,可以将代理配置为只实现特定的接口。

4.2

在Symfony 4.2中引入了代理接口。欧宝娱乐app下载地址

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \树枝\ AppExtension:懒惰:“树枝\ \ ExtensionInterface延伸”#或完整的定义:懒惰:真正的标签:-名称:“代理”接口:“树枝\ \ ExtensionInterface延伸”

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

提示

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

额外的资源

中,可以阅读有关如何实例化、生成和初始化代理的更多信息欧宝体育电话ProxyManager的文档

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。