跳到內容

如何使服務引數/參考成為選用

編輯此頁面

有時,您的其中一項服務可能具有選用的依賴項,這表示您的服務正常運作並不需要該依賴項。您可以設定容器,在此情況下不拋出錯誤。

將遺失的依賴項設定為 null

您可以使用 null 策略,明確地將引數設定為 null,如果該服務不存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="https://symfony.dev.org.tw/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://symfony.dev.org.tw/schema/dic/services
        https://symfony.dev.org.tw/schema/dic/services/services-1.0.xsd">

    <services>
        <!-- ... -->

        <service id="App\Newsletter\NewsletterManager">
            <argument type="service" id="logger" on-invalid="null"/>
        </service>
    </services>
</container>

注意

YAML 驅動程式目前不支援「null」策略。

忽略遺失的依賴項

忽略遺失依賴項的行為與「null」行為相同,但當在方法呼叫中使用時,方法呼叫本身將會被移除。

在以下範例中,如果服務存在,容器將使用方法呼叫注入服務,如果服務不存在,則移除方法呼叫

1
2
3
4
5
# config/services.yaml
services:
    App\Newsletter\NewsletterManager:
        calls:
            - setLogger: ['@?logger']

注意

如果方法呼叫的引數是引數集合,且其中任何一個引數遺失,則這些元素會被移除,但方法呼叫仍會使用集合中剩餘的元素進行。

在 YAML 中,特殊的 @? 語法告知服務容器,該依賴項是選用的。NewsletterManager 也必須透過新增 setLogger() 方法來重寫

1
2
3
4
public function setLogger(LoggerInterface $logger): void
{
    // ...
}
本作品,包含程式碼範例,依據 Creative Commons BY-SA 3.0 授權條款發布。
目錄
    版本