跳到內容

服務方法呼叫與 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']

提示

如果啟用了自動裝配,您也可以使用屬性;以前面的範例來說,它會是

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 授權條款發佈。
目錄
    版本