如何使服务参数/引用成为可选
有时,您的某个服务可能具有可选依赖项,这意味着该依赖项不是您的服务正常运行所必需的。您可以配置容器在这种情况下不抛出错误。
将缺失的依赖项设置为 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="http://symfony.ac.cn/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.ac.cn/schema/dic/services
http://symfony.ac.cn/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 许可协议获得许可。