Predvoditelev.RU
Заметки

Конфигурация Yii на пальцах

Эта статья — попытка объяснить как устроен механизм конфигурирования приложений на базе фреймворка Yii3. Для тех кто спешит, основные тезисы.

  • Конфигурация приложения в Yii состоит из нескольких массивов.
  • Массив конфигурации может собираться из нескольких файлов.
  • Файлы конфигурации могут располагаться как в приложении, так и в подключаемых пакетах.
  • Сборка массива конфигурации осуществляется c помощью пакета Yii Config.
  • Структура файлов определяется инструкцией по сборке.
  • Структура файлов в пакетах не зависит от структуры файлов в приложении.

Ну а теперь подробно.

Массивы конфигурации

В отличие от Yii2, где конфигурация приложения представлет собой один массив, в Yii3 — это уже несколько массивов, которые конфигурируют соответствующие части приложения:

- контейнер зависимостей,
- события,
- виджеты,
- и т. д.

Итак, первый тезис: конфигурация приложения в Yii состоит из нескольких массивов.

Для хранения массивов используются PHP-файлы вида:

<?php

return [
    // configuration
];

Возможно, в будущем будет добавлена поддержка других вариантов хранения (YAML, XML, JSON и т. д.), но пока только PHP-массивы. 

Поддерживается разбиение массива конфигурации на составляющие. Это необходимо в следующих ситуациях.

  • Массив может быть слишком большим. Например, конфигурацию контейнера в приложении можно разбить по группам сервисов: БД, роутер, интернационализация и т. д.
  • Некоторые части массива могут подключаться в зависимости от неких условий. Например, разные части конфигурации в зависимости от окружения (тестовое или боевое).

Таким образом мы приходим ко второму тезису: массив конфигурации может собираться из нескольких файлов.

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

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

Сборка конфигурации

Массив конфигурации может быть расположен в нескольких файлах, которые расположены как в приложении, так и в подключаемых пакетах. Сборку итогового массива обеспечивает пакет Yii Config.

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

Инструкция по сборке представляет собой массив, состоящий из нескольких частей:

  • config-plugin-options — массив настроек Yii Config,
  • config-plugin — массив с базовой инструкцией, где:
    • ключи — названия конфигураций (например, это может быть "widgets" — конфигурация фабрики виджетов, или "container" — конфигурация контейнера зависимостей);
    • значения — список файлов для объединения, в том числе можно использовать ссылки на другие конфигурации.
  • 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" будет собрана из файлов:

  • инструкция из пакета "brand/calc":
    • /vendor/brand/calc/config/container.php
  • инструкция из пакета "brand/parser":
    • /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 можно прочитать в документации.

@sergei_predvoditelev — Авторский канал в Telegram: заметки о веб-разработке, PHP, открытом ПО, развитии и немного о жизни.