Разделение конфигураций в Yii по взрослому

в 10:52, , рубрики: php, yii, Программирование, метки: , ,

Вместо предисловия
Занялся я с недавних пор Yii «по производственной необходимости». До этого сидел на ZF. Некоторые вещи в Yii кажутся неудобными или негибкими. В частности отсутствие раздельное конфигурации и работа с frontend/backend. Правда AR порадовал )). Но о чем это я?!

Ближе к делу
Начнем с самого начала, с удобной и гибкой конфигурации. Разумеется что перед решением по разделению конфигурации для паблик сервера и разработчика я полазил по форумам, посмотрел что пишут на хабре… Но все решения сводятся к определению имени хоста и решения на его основе о нужной конфигурации. Но увольте, есть же тестеры, есть команды разработчиков, есть много еще чего. В общем предлагаемый подход мне не нравится. Предлагаю свое решение по примеру ZF. Все очень просто. Я использую apache, поэтому решение для него. Весть секрет заключается в определении серверной переменной APPLICATION_ENV, а все остальное как везде.

Файл index.php

// тут вся магия. Мы смотрим серверную переменую и заносим ее в константу. Потом можем использовать ее везде. 
// По умолчанию production
defined('APPLICATION_ENV') 
	|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Подключаем Yii
$yii=dirname(__FILE__).'/../framework/yii.php';

/**
 * Включим дебаг если мы разработчики
 */
if (APPLICATION_ENV == 'devel')
{
	defined('YII_DEBUG') or define('YII_DEBUG',true);
	defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);
}

// А вот так мы подключим нужную нам конфигурацию
$config = dirname(__FILE__).'/protected/config/'.APPLICATION_ENV.'.php';

require_once($yii);

Yii::createWebApplication($config)->run();

файл конфигурации нашего сайта в apache2

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName myplace.dev
        DocumentRoot /home/project/dev/myplace/public

# А тут мы указываем тип конфигурации который нам нужен. 
SetEnv APPLICATION_ENV "devel"

        <Directory /home/project/dev/myplace/public/>
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Для большей удобности можно воспользоватся слиянием конфигураций по примеру

Файл production.php и devel.php в папке с конфигурацией

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

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

Успехов.

Автор: suver

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js