Используем несколько конфигураций в одном приложении

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

Автоматический выбор конфигурации

При создании приложения единственным параметром, который мы можем
передать в Yii::createWebApplication, является путь к файлу конфигурации,
согласно которому оно будет работать. Этим можно воспользоваться:

index.php:

$webRoot=dirname(__FILE__);

// Если хост равен localhost, то включаем режим отладки и подключаем отладочную
// конфигурацию
if($_SERVER['HTTP_HOST']=='localhost'){
	define('YII_DEBUG', true);
	require_once(dirname($webRoot).'/framework/yii.php');
	$configFile=$webRoot.'/../app/config/dev.php';
}
// Иначе выключаем режим отладки и подключаем рабочую конфигурацию
else { 
	define('YII_DEBUG', false);
	require_once(dirname($webRoot).'/framework/yiilite.php');
	$configFile=$webRoot.'/../app/config/production.php';
}

$app = Yii::createWebApplication($configFile)->run();

Подобным образом можно подключать файлы конфигурации в зависмости, например,
от IP-адреса или наличия определённого cookie.

Наследование конфигурации

Почти полностью дублировать конфигурацию в файле разработчика и рабочем файле
неудобно. К счастью, конфигурация приложения в Yii хранится
в виде PHP файла (protected/config/main.php). В результате, мы можем разместить
в нём код, который позволит нам наследовать конфигурацию.

Итак, нам необходимо завести три файла:

  1. main.php с конфигурацией приложения по умолчанию.
  2. dev.php, который будет содержать конфигурацию для
    разработчика. К примеру, в этой конфигурации мы можем использовать другую
    базу данных, выводить отладочную информацию на экран и многое другое.
  3. production.php, содержащий настройки, специфичные для работы на сервере.

Покажем наследование на примере dev.php. Для этого используем CMap::mergeArray().

dev.php:

return CMap::mergeArray(
	// наследуемся от main.php
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
        	// переопределяем компонент db
            'db'=>array(
                // настройки для конфигурации разработчика
            ),
        ),
    )
);

Аналогичным образом поступим с production.php.