服務方法呼叫與 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 授權條款發佈。