如何使服務引數/參考成為選用
有時,您的其中一項服務可能具有選用的依賴項,這表示您的服務正常運作並不需要該依賴項。您可以設定容器,在此情況下不拋出錯誤。
將遺失的依賴項設定為 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 授權條款發布。