服务方法调用和Setter注入

编辑本页

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

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

服务方法调用和Setter注入

提示

如果你正在使用自动装配,你可以使用#[要求]@ required自动配置方法调用

通常,您希望通过构造函数注入依赖项。但有时,特别是如果依赖项是可选的,你可能想要使用“setter注入”。例如:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /服务/ MessageGenerator.php名称空间应用程序服务使用Psr日志LoggerInterfaceMessageGenerator私人日志记录器公共函数setLogger(LoggerInterface日志记录器无效->记录器=日志记录器;}/ /……

将容器配置为调用setLogger方法,使用调用关键:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/ services.yaml服务:应用程序服务\ \ MessageGenerator:#……电话:-setLogger:(“@logger”)

为了提供不可变服务,一些类实现了不可变setter。这样的setter返回已配置类的一个新实例,而不是改变被调用的对象:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src /服务/ MessageGenerator.php名称空间应用程序服务使用Psr日志LoggerInterfaceMessageGenerator私人日志记录器公共函数withLogger(LoggerInterface日志记录器自我克隆->记录器=日志记录器返回;}/ /……

因为该方法返回一个单独的克隆实例,所以配置这样的服务意味着使用wither方法的返回值($service = $service->withLogger($logger);).告诉容器应该这样做的配置是这样的:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/ services.yaml服务:应用程序服务\ \ MessageGenerator:#……电话:-withLogger:returns_clone !(“@logger”)

提示

如果启用了自动连接,您还可以使用注释;对于前面的例子,它将是:

1 2 3 4 5 6 7 8 9 10 11
/ * * *@ required@return静态* /公共函数withLogger(LoggerInterface日志记录器克隆->记录器=日志记录器返回;}

您还可以利用PHP 8静态返回类型,而不是@return静态注释。如果你不想要PHP 8的方法静态返回类型和@ required注释要表现为凋零,可以添加一个@return美元这注释来禁用返回克隆特性。

5.1

支持PHP 8静态返回类型在Symfony 5.1中引入。欧宝娱乐app下载地址

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode