Загрузка источников

Дата обновления перевода 2023-08-21

Загрузка источников

Загрузчики наполняют конфигурацию приложения из разных источников, вроде файлов YAML. Комонент Config определяет интерфейс для таких загрузчиков. Компоненты Dependency Injection и Routing
поставляются со специальными загузчиками для разных форматов файлов.

Обнаружение источников

Загрузка конфигурации обычно начинается с поиска источников, в основном, файлов. Это можно сделать с помощью FileLocator:

1
2
3
4
5
6
use Symfony\Component\Config\FileLocator;

$configDirectories = array(__DIR__.'/config');

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

Локатор получает коллекцию локаций, где ему стоит искать файлы. Первый аргумент locate() - это имя файла, который нужно искать. Второй аргумент может быть текущим путём и если он есть, указатель будет вначале искать в этом каталоге. Третий аргумент определяет, нужно ли указателю возвращать первый найденный файл или массив, содержащий все совпадения.

Загрузчики источнков

Для каждого типа источника (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): void
    {
        $configValues = Yaml::parse(file_get_contents($resource));

        // ... обработать значения конфигурации

        // возможно импортировать другие источники;

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

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

Поиск правильного загрузчика

LoaderResolver получает в качестве своего первого аргумента коллекцию загрузчиков. Когда источник (к примеру, XML файл) должен быть загружен, он просматривает эту коллекцию загрузчиков и возвращает тот, который поддерживает конкретный тип источника.

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 используется для загрузки этого источника, потому что
// он поддерживает файлы с расширением '.yaml'
$delegatingLoader->load(__DIR__.'/users.yaml');