How to Import Configuration Files/Resources

Tip

ヒント

In this section, service configuration files are referred to as resources. While most configuration resources are files (e.g. YAML, XML, PHP), Symfony is able to load configuration from anywhere (e.g. a database or even via an external web service).

このセクションでは、サービス構成ファイルをリソースと呼びます。ほとんどの構成リソースはファイル (YAML、XML、PHP など) ですが、Symfony はどこからでも構成をロードできます (データベースや外部 Web サービスなど)。

The service container is built using a single configuration resource (config/services.yaml by default). This gives you absolute flexibility over the services in your application.

サービス コンテナーは、単一の構成リソース (デフォルトでは config/services.yaml) を使用して構築されます。これにより、アプリケーション内のサービスに対して絶対的な柔軟性が得られます。

External service configuration can be imported in two different ways. The first method, commonly used to import other resources, is via the imports directive. The second method, using dependency injection extensions, is used by third-party bundles to load the configuration. Read on to learn more about both methods.

外部サービス構成は、2 つの異なる方法でインポートできます。他のリソースをインポートするために一般的に使用される最初の方法は、imports ディレクティブを使用する方法です。依存性注入拡張機能を使用する 2 番目の方法は、サードパーティのバンドルで構成を読み込むために使用されます。両方の方法の詳細については、以下をお読みください。

Importing Configuration with imports

By default, service configuration lives in config/services.yaml. But if that file becomes large, you're free to organize into multiple files. Suppose you decided to move some configuration to a new file:

デフォルトでは、サービス構成は config/services.yaml にあります。ただし、そのファイルが大きくなった場合は、自由に複数のファイルに整理できます。一部の構成を新しいファイルに移動することにしたとします。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
# config/services/mailer.yaml
parameters:
    # ... some parameters

services:
    # ... some services

To import this file, use the imports key from any other file and pass either a relative or absolute path to the imported file:

このファイルをインポートするには、他のファイルの imports キーを使用し、インポートしたファイルへの相対パスまたは絶対パスを渡します。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/services.yaml
imports:
    - { resource: services/mailer.yaml }
    # If you want to import a whole directory:
    - { resource: services/ }
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # ...

When loading a configuration file, Symfony loads first the imported files and then it processes the parameters and services defined in the file. If you use the default services.yaml configuration as in the above example, the App\ definition creates services for classes found in ../src/*. If your imported file defines services for those classes too, they will be overridden.

設定ファイルをロードするとき、Symfony は最初にインポートされたファイルをロードし、次にファイルで定義されたパラメーターとサービスを処理します。上記の例のように、デフォルトの services.yaml 構成を使用すると、App\ 定義によって、../src/* にあるクラスのサービスが作成されます。インポートしたファイルでこれらのクラスのサービスも定義されている場合、それらはオーバーライドされます。

A possible solution for this is to add the classes and/or directories of the imported files in the exclude option of the App\ definition. Another solution is to not use imports and add the service definitions in the same file, but after the App\ definition to override it.

これに対する考えられる解決策は、インポートされたファイルのクラスやディレクトリを App\ 定義の除外オプションに追加することです。別の解決策は、インポートを使用せず、サービス定義を同じファイルに追加することですが、App\ 定義の後にそれを上書きします。

Note

ノート

Due to the way in which parameters are resolved, you cannot use them to build paths in imports dynamically. This means that something like the following doesn't work:

パラメータが解決される方法が原因で、それらを使用してインポートでパスを動的に構築することはできません。これは、次のようなものが機能しないことを意味します。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/services.yaml
imports:
    - { resource: '%kernel.project_dir%/somefile.yaml' }

Importing Configuration via Container Extensions

Third-party bundle container configuration, including Symfony core services, are usually loaded using another method: a container extension.

Symfony コア サービスを含むサードパーティ バンドル コンテナー構成は、通常、コンテナー拡張という別の方法を使用して読み込まれます。

Internally, each bundle defines its services in files like you've seen so far. However, these files aren't imported using the import directive. Instead, bundles use a dependency injection extension to load the files automatically. As soon as you enable a bundle, its extension is called, which is able to load service configuration files.

内部的には、これまで見てきたように、各バンドルはそのサービスをファイルで定義します。ただし、これらのファイルは import ディレクティブを使用してインポートされません。代わりに、バンドルは依存性注入拡張機能を使用してファイルを自動的にロードします。バンドルを有効にするとすぐに、サービス構成ファイルをロードできる拡張機能が呼び出されます。

In fact, each configuration file in config/packages/ is passed to the extension of its related bundle - e.g. FrameworkBundle or TwigBundle - and used to configure those services further.

実際、config/packages/ 内の各構成ファイルは、関連するバンドルの拡張子に渡されます。 FrameworkBundle または TwigBundle - これらのサービスをさらに構成するために使用されます。