服务方法调用和 Setter 注入
提示
如果您正在使用自动装配,您可以使用 #[Required]
来 自动配置方法调用。
通常,您会希望通过构造函数注入您的依赖项。但有时,特别是当依赖项是可选的时,您可能希望使用“setter 注入”。例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// src/Service/MessageGenerator.php
namespace App\Service;
use Psr\Log\LoggerInterface;
class MessageGenerator
{
private LoggerInterface $logger;
public function setLogger(LoggerInterface $logger): void
{
$this->logger = $logger;
}
// ...
}
要配置容器来调用 setLogger
方法,请使用 calls
键
1 2 3 4 5 6
# config/services.yaml
services:
App\Service\MessageGenerator:
# ...
calls:
- setLogger: ['@logger']
为了提供不可变的服务,一些类实现了不可变的 setter。这样的 setter 返回配置类的新实例,而不是改变它们被调用的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// src/Service/MessageGenerator.php
namespace App\Service;
use Psr\Log\LoggerInterface;
class MessageGenerator
{
private LoggerInterface $logger;
public function withLogger(LoggerInterface $logger): self
{
$new = clone $this;
$new->logger = $logger;
return $new;
}
// ...
}
由于该方法返回一个单独的克隆实例,配置这样的服务意味着使用 wither 方法的返回值 ($service = $service->withLogger($logger);
)。告诉容器它应该这样做的配置如下所示
1 2 3 4 5 6
# config/services.yaml
services:
App\Service\MessageGenerator:
# ...
calls:
- withLogger: !returns_clone ['@logger']
提示
如果启用了 autowire,您也可以使用属性;对于之前的示例,它将是
1 2 3 4 5 6 7 8
#[Required]
public function withLogger(LoggerInterface $logger): static
{
$new = clone $this;
$new->logger = $logger;
return $new;
}
如果您不希望具有 static
返回类型和 #[Required]
属性的方法表现为 wither,您可以添加 @return $this
注释来禁用返回克隆功能。
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可证获得许可。