How to Make Service Arguments/References Optional

Sometimes, one of your services may have an optional dependency, meaning that the dependency is not required for your service to work properly. You can configure the container to not throw an error in this case.

場合によっては、サービスの 1 つにオプションの依存関係がある場合があります。つまり、サービスが適切に機能するために依存関係が必要ないことを意味します。この場合、コンテナーがエラーをスローしないように構成できます。

Setting Missing Dependencies to null

You can use the null strategy to explicitly set the argument to null if the service does not exist:

サービスが存在しない場合は、 null 戦略を使用して引数を明示的に null に設定できます。
  • XML
    XML
  • PHP
    PHP
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.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        https://symfony.com/schema/dic/services/services-1.0.xsd">

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

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

Note

ノート

The "null" strategy is not currently supported by the YAML driver.

「null」戦略は現在、YAML ドライバーではサポートされていません。

Ignoring Missing Dependencies

The behavior of ignoring missing dependencies is the same as the "null" behavior except when used within a method call, in which case the method call itself will be removed.

欠落している依存関係を無視する動作は、メソッド呼び出し内で使用される場合を除き、"null" 動作と同じです。この場合、メソッド呼び出し自体が削除されます。

In the following example the container will inject a service using a method call if the service exists and remove the method call if it does not:

次の例では、コンテナーは、サービスが存在する場合はメソッド呼び出しを使用してサービスを挿入し、存在しない場合はメソッド呼び出しを削除します。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
# config/services.yaml
services:
    App\Newsletter\NewsletterManager:
        calls:
            - setLogger: ['@?logger']

Note

ノート

If the argument to the method call is a collection of arguments and any of them is missing, those elements are removed but the method call is still made with the remaining elements of the collection.

メソッド呼び出しの引数が引数のコレクションで、いずれかが欠落している場合、それらの要素は削除されますが、コレクションの残りの要素を使用してメソッド呼び出しが行われます。

In YAML, the special @? syntax tells the service container that the dependency is optional. The NewsletterManager must also be rewritten by adding a setLogger() method:

YAML では、特殊な @?構文は、依存関係がオプションであることをサービス コンテナーに伝えます。 NewsletterManager も setLogger() メソッドを追加して書き直す必要があります。
1
2
3
4
public function setLogger(LoggerInterface $logger): void
{
    // ...
}