Эта статья — попытка объяснить как устроен механизм конфигурирования приложений на базе фреймворка Yii3. Для тех кто спешит, основные тезисы.
Ну а теперь подробно.
В отличие от Yii2, где конфигурация приложения представлет собой один массив, в Yii3 — это уже несколько массивов, которые конфигурируют соответствующие части приложения:
- контейнер зависимостей,
- события,
- виджеты,
- и т. д.
Итак, первый тезис: конфигурация приложения в Yii состоит из нескольких массивов.
Для хранения массивов используются PHP-файлы вида:
<?php
return [
// configuration
];
Возможно, в будущем будет добавлена поддержка других вариантов хранения (YAML, XML, JSON и т. д.), но пока только PHP-массивы.
Поддерживается разбиение массива конфигурации на составляющие. Это необходимо в следующих ситуациях.
Таким образом мы приходим ко второму тезису: массив конфигурации может собираться из нескольких файлов.
Пакеты, подключаемые в приложении могут требовать предварительного конфигурирования и предоставлять соответствующую конфигурацию по умолчанию. Это очень удобно — поставил пакет и сразу можно пользоваться, не нужно ничего копировать в конфигурацию приложения.
Отсюда следует ещё один тезис: файлы конфигурации могут располагаться как в приложении, так и в подключаемых пакетах.
Массив конфигурации может быть расположен в нескольких файлах, которые расположены как в приложении, так и в подключаемых пакетах. Сборку итогового массива обеспечивает пакет Yii Config.
Здесь мы приходим к следующему тезису: структура файлов определяется инструкцией по сборке.
Инструкция по сборке представляет собой массив, состоящий из нескольких частей:
config-plugin-options
— массив настроек Yii Config,config-plugin
— массив с базовой инструкцией, где:config-plugin-environments
— дополнения к основной инструкции, специфичные для окружения.Инструкция по сборке используется как в приложении, так и в пакетах. Синтаксис идентичен.
Рассмотрим упрощённый пример конфигурации контейнера зависимостей.
// Инструкция в приложении
[
"config-plugin-options" => [
// Базовая директория с конфигурациями — "/config"
"source-directory": "config",
],
"config-plugin" => [
"container" => [
"container/db.php",
"container/logger.php",
"container/i18n.php",
],
"container-web" => [
"$container",
"container/router.php",
],
],
"config-plugin-environments": [
"dev": [
"container": "envs/dev/container.php",
],
"production": [
"container": "envs/production/container.php",
],
],
],
// Инструкция в пакете brand/calc
[
"config-plugin" => [
"container" => [
"config/container.php",
],
],
]
// Инструкция в пакете brand/parser
[
"config-plugin" => [
"container" => [
"config/xml-parser.php",
"config/yaml-parser.php",
],
],
]
Конфигурация "container" для окружения "dev" будет собрана из файлов:
/vendor/brand/calc/config/container.php
/vendor/brand/parser/config/xml-parser.php
/vendor/brand/parser/config/yaml-parser.php
/config/container/db.php
/config/container/logger.php
/config/container/i18n.php
/config/envs/dev/container.php
Для получения конфигурации "container-web" будет сначала собрана конфигурация "container", а затем она будет объединена с массивом из файла /config/container/router.php
.
Инструкция по сборке может хранится в секции "extra" файла "composer.json" или же в отдельном PHP-файле.
Пример наглядно отображает последний тезис: структура файлов в пакетах не зависит от структуры файлов в приложении.
Подробнее о настройке и особенностях работы Yii Config можно прочитать в документации.