跳到内容

如何使服务参数/引用成为可选

编辑此页

有时,您的某个服务可能具有可选依赖项,这意味着该依赖项不是您的服务正常运行所必需的。您可以配置容器在这种情况下不抛出错误。

将缺失的依赖项设置为 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 许可协议获得许可。
目录
    版本