Загрузка источников
Дата обновления перевода 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');