跳到内容

服务方法调用和 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 许可证获得许可。
TOC
    版本