Завантаження джерел

Дата оновлення перекладу 2022-12-12

Завантаження джерел

Завантажувачі наповнюють конфігурацію додатку з різних джерел на кшталт файлів 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)
    {
        $configValues = Yaml::parse(file_get_contents($resource));

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

        // можливо імпортувати інші джерела;

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

    public function supports($resource, $type = null)
    {
        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');