Loading Resources

Loaders populate the application's configuration from different sources like YAML files. The Config component defines the interface for such loaders. The Dependency Injection and Routing components come with specialized loaders for different file formats.

ローダーは、YAML ファイルなどのさまざまなソースからアプリケーションの構成を取り込みます。 Config コンポーネントは、そのようなローダーのインターフェースを定義します。 Dependency Injection および Routing コンポーネントには、さまざまなファイル形式に特化したローダーが付属しています。

Locating Resources

Loading the configuration normally starts with a search for resources, mostly files. This can be done with the FileLocator:

構成のロードは通常、リソース (主にファイル) の検索から始まります。これは FileLocator で行うことができます:
1
2
3
4
5
6
use Symfony\Component\Config\FileLocator;

$configDirectories = [__DIR__.'/config'];

$fileLocator = new FileLocator($configDirectories);
$yamlUserFiles = $fileLocator->locate('users.yaml', null, false);

The locator receives a collection of locations where it should look for files. The first argument of locate() is the name of the file to look for. The second argument may be the current path and when supplied, the locator will look in this directory first. The third argument indicates whether or not the locator should return the first file it has found or an array containing all matches.

ロケーターは、ファイルを探す場所のコレクションを受け取ります。 locate() の最初の引数は、検索するファイルの名前です。 2 番目の引数は現在のパスである場合があり、指定された場合、ロケーターはこのディレクトリを最初に検索します。 3 番目の引数は、ロケーターが最初に見つけたファイルを返すか、すべての一致を含む配列を返すかを示します。

Resource Loaders

For each type of resource (YAML, XML, annotation, etc.) a loader must be defined. Each loader should implement LoaderInterface or extend the abstract FileLoader class, which allows for recursively importing other resources:

リソースのタイプ (YAML、XML、注釈など) ごとに、ローダーを定義する必要があります。各ローダーは、LoaderInterface を実装するか、抽象 FileLoader クラスを拡張する必要があります。これにより、他のリソースを再帰的にインポートできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace Acme\Config\Loader;

use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Yaml\Yaml;

class YamlUserLoader extends FileLoader
{
    public function load($resource, $type = null)
    {
        $configValues = Yaml::parse(file_get_contents($resource));

        // ... handle the config values

        // maybe import some other resource:

        // $this->import('extra_users.yaml');
    }

    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'yaml' === pathinfo(
            $resource,
            PATHINFO_EXTENSION
        );
    }
}

Finding the Right Loader

The LoaderResolver receives as its first constructor argument a collection of loaders. When a resource (for instance an XML file) should be loaded, it loops through this collection of loaders and returns the loader which supports this particular resource type.

LoaderResolver は、最初のコンストラクター引数としてローダーのコレクションを受け取ります。リソース (XML ファイルなど) をロードする必要がある場合、このローダーのコレクションをループして、この特定のリソース タイプをサポートするローダーを返します。

The DelegatingLoader makes use of the LoaderResolver. When it is asked to load a resource, it delegates this question to the LoaderResolver. In case the resolver has found a suitable loader, this loader will be asked to load the resource:

DelegatingLoader は LoaderResolver を利用します。リソースをロードするように求められると、この質問を LoaderResolver に委譲します。リゾルバーが適切なローダーを見つけた場合、このローダーはリソースをロードするように求められます。
1
2
3
4
5
6
7
8
9
10
use Acme\Config\Loader\YamlUserLoader;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;

$loaderResolver = new LoaderResolver([new YamlUserLoader($fileLocator)]);
$delegatingLoader = new DelegatingLoader($loaderResolver);

// YamlUserLoader is used to load this resource because it supports
// files with the '.yaml' extension
$delegatingLoader->load(__DIR__.'/users.yaml');