Наконец-то нашлось время написать про расширение Flexible Config для Yii, которое я написал на выходных.

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

  1. При создании нового приложения нужно было по новой настраивать конфигурацию;
  2. Когда проект разрабатывается несколькими программистами и хранится в какой-либо системе контроля версий, остро встает вопрос синхронизации конфигураций разработчиков;И я решил раз и навсегда решить эти проблемы. Для этого было написано расширение для Yii, которое добавляет для класса CApplication один метод loadConfigure().

Подробнее о настройках расширения можно прочитать в ридми, а я приведу пример оттуда и объясню его работу.

Содержание файла index.php:

Содержание файла main.php:

Опишу что происходит. С начала инклудится файл main.php, в котором находится начальная конфигурация. В том же файле находится код который автоматически может определять (в данном случае, по наличию слова "localhost" в адресе сайта) какой режим включать - dev или production. Этот код из index.php в main.php, чтобы не было необходимости когда либо редактировать файл index.php. И поэтому файл main.php должен инклудится, чтобы константа YII_DEBUG была определена до загрузки файлов фреймворка.

Затем, как обычно, создается экземпляр класса CWebApplication. После этого вызывается добавленный с помощью поведения метод loadConfigure(), который загружает конфигурацию согласно настройкам указанных для поведения в файле main.php.

Каждая конфигурация может иметь одного или нескольких родителей. Это означает, что сначала будут загружены все родительские конфиги (в порядка перечисления в настройках), если у родителя есть свои родители, то они тоже будут загружены (вложенность не ограничена). Метод наследования очень простой: CMap::mergeArray('parent', 'child').

И есть одна особенность. Например, текущая конфигурация dev. Тогда после полной загрузки этого конфига, если в той же папке существует файл dev_local.php, то он будет загружен автоматически. Т.е. фактически получается 'dev_local' = array('parent' => 'dev').

Надеюсь это расширение будет полезно не только для меня.

Скачать расширение можно здесь.