Используем много конфигураций в одном приложении
Рубрика: Перевод Cookbook
14 мая 2009
Сегодняшняя статья является переводом "Manage application configuration in different modes" из Cookbook. При создании нашего приложения единственным параметром который мы можем передать в Yii::createWebApplication - является ссылка на файл конфигурации, согласно которому оно и будет работать. С другой стороны было бы отлично если приложение могло бы использовать разные конфигурационные файлы для некоторых случаев. Например, может потребоваться применять различные конфигурационные файлы при работе в обычном режиме, в режиме разработки и режиме тестирования; В крупных командах разработчики часто работают со своим собственным слепком базы данных, параметрами и конфигурацией. В этом руководстве вы получите практические знания по всем выше перечисленным ситуациям и научитесь использовать разные конфигурационные файлы для своих нужд.
Прежде чем начать, мы должны отметить что конфигурация приложения в Yii хранится в виде PHP файла (protected/config/main.php). В результате мы можем разместить в нем любой рабочий PHP скрипт что сделает нашу конфигурацию более "умной", чем простое возвращение массива из параметров и значений.
Во-первых, создаем файл main.php с конфигурацией приложения по умолчанию которую мы хотим использовать.
Во-вторых, создаем файл dev.php который будет содержать в себе конфигурацию разработчиков. К примеру в этой конфигурации мы можем использовать другую базу данных, выводить дебагер на экран и многое другое. Поскольку основные параметры приложения у нас находятся в main.php файле, то dev.php должен просто наследовать файл main.php и переопределять необходимые параметры конфигурации. Для того чтобы осуществить наследование мы используем CMap:: mergeArray. Файл dev.php будет выглядеть следующим образом:
<?php
return CMap::mergeArray(
require(dirname(__FILE__).'/main.php'),
array(
'components'=>array(
'db'=>array(
// define DB connection used for development
),
),
)
);В начале мы подключили файл main.php который содержит в себе конфигурацию по умолчанию, после этого в виде массива указали конфигурацию для dev.php. (в примере выше показано как использовать индивидуальную конфигурацию DB отличную от main.php). В конечном итоге происходит возврат результата слияния этих двух массивов. Имейте ввиду что мы не должны использовать array_merge() или array_merge_recursive() функции.
Аналогичным образом мы можем создать с вами тестовую конфигурацию и сохранить её в файле test.php
Для того чтобы запустить приложения в разных режимах (обычный режим, режим разработчика, режим тестирования) мы должны с вами в файле index.php в метод Yii::createWebApplication передать название соответствующего файла конфигурации. Что бы спасти вас от постоянного изменения файла index.php что бы запускать приложение под новой конфигурацией - мы можем создать отдельный загрузочный файл для каждого из сценариев. Например, мы можем создать index.php, index_dev.php, index_test.php которые будут полностью идентичны кроме значения в Yii::createWebApplication (для index_dev.php вы укажите "dev.php", для index.php - "main.php" и т.д).
Теперь что бы загрузить наше приложение в обычном режиме в браузере мы используем index.php (localhost/index.php), для загрузки конфигурации разработчиков в браузере мы используем index_dev.php (localhost/index_dev.php) соответственно.
Подсказка: Используя описанную выше технику вы также можете использовать разные параметры (указанные через Yii::app()->params) для различных режимов загрузки.
Ссылка на "Manage application configuration in different modes" (Англ.)
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Я рад сообщить вам о выходе сразу двух версий нашего фреймворка. Для любителей стабильности была предоставлена версия 1.0.11 с большим ... "Yii PHP framework 1.0.11 и 1.1 RC"
- Давайте сегодня поговорим что же такое “контроллер” и для чего он используется в приложениях на базе MVC
next
В уроке ... "Шаг 5 : Контроллер"
- Буквально пару дней назад закончилась вторая Международная конференция "FOSS Sea" в Одессе. Как вы понимаете я являлся одним из ... "FOSS Sea 2009"

[guest] Павел Фролов
Было сказано: Вторник, 12 Январь 2010
Спасибо! Хорошая заметка, от себя добавлю:
index.php:
// берем переменную окружения
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
...
// конфиг по имени нашей переменной окружения
$config=dirname(__FILE__).'/protected/config/' . APPLICATION_ENV . '.php';
далее в .htaccess прописываем эту переменную окружения, для девелопа
SetEnv APPLICATION_ENV development
...
для продакешна
SetEnv APPLICATION_ENV production
...
ну и по Вашему методу когфиги: development.php и production.php (и тд)
соответственно для каждого проекта определяем режим чтобы через .htaccess ( заливаем его и не трогаем более :) )

[guest] Гость
Было сказано: Вторник, 12 Январь 2010
оригинально! Я пользуюсь переменной $_SEVER и по условию выюираю конфиг.

[guest] Павел Фролов
Было сказано: Среда, 13 Январь 2010
Эту фишку я я просек когда на ZF работал.
От условий лучше всегда избавляться - это негибкий стиль.
Хорошая книга мартина фаулера "рефакторинг". Советую почитать. Я лично очень много от туда почерпнул.

SpiLLeR
Было сказано: Среда, 13 Январь 2010
У Вас используется такое же условие, в чем разница?
Вы проверяете константу APPLICATION_ENV и потом по условию подставляете конфиг. Я к примеру делаю:
if($_SERVER['SERVER_ADDR'] === '127.0.0.1') {
// можно определить другие локальный параметры
$config = dirname(dirname(__FILE__)) . '/application/config/main_loc.php';
} else {
$config = dirname(dirname(__FILE__)) . '/application/config/main.php';
}

[adm] zolter
Было сказано: Среда, 13 Январь 2010
"Рефакторинг" на днях почитаю, спасибо.
По отзывам говорят что хорошая книга

[guest] Semasping
Было сказано: Среда, 13 Январь 2010
Добрый день! вот уже 4 дня как узнал про Yii.
Много читаю, но кодить еще не начал...
раньше работал с CI
Возник следующий вопрос насчет конфига:
Мне кажется в Ci удобнее хранится конфиг, вроде тоже в массиве но редактировать его удобнее, можно ли тут сделать так же т.е. не
array(''=>'',...)
а $config['']='',
было бы нагляднее...
Может уже есть такое расширение (глянул, не нашел)
А за блог с уроками огромное Спасибо, описано все отлично!!!

[adm] zolter
Было сказано: Среда, 13 Январь 2010
Так в принципе без разницы как вы визуально представляете массив. Т.е. вот такой конфиг будет тоже вполне рабочим:
<?php
$config = array();
$config['basePath'] = dirname(__FILE__).DIRECTORY_SEPARATOR.'..';
$config['name'] = 'DbHelp.ru';
$config['defaultController'] = 'post';
$config['preload'] = array('log');
$config['import'][] = 'application.models.*';
$config['import'][] = 'application.components.*';
и т.д.
return $config;

semasping
Было сказано: Среда, 13 Январь 2010
и при обновлении версий frameworka
он не затронется т.к обновляется только те папки которые вынесены из webroot/, a само приложение (то что сгенерировано с помощью yiic не участвует в обновлении)
я все верно понимаю ?

[adm] zolter
Было сказано: Среда, 13 Январь 2010
Ага, при обновлении только папку framework меняете. А папку protected, в которой всё ваше приложение - не трогаете.

[guest] Гость
Было сказано: Среда, 13 Январь 2010
Скоро Вы опубликуете стою вторую статью про написание биллинг системы? А то вчера уже обещали... А никак не опубликуете

[adm] zolter
Было сказано: Среда, 13 Январь 2010
Вот сижу графики подгоняю для статьи. Постараюсь успеть сегодня

[guest] Павел Фролов
Было сказано: Воскресенье, 24 Январь 2010
> SpiLLeR
> Было сказано: Среда, 13 Январь 2010
> У Вас используется такое же условие, в чем разница?
> Вы проверяете константу APPLICATION_ENV и потом по условию подставляете конфиг.
Условия у меня нету.
Разница в том, что Вы жестко прописываете названия конфигов в коде. У меня же такого ограничения нет. Для того что бы в моем коде добавить новый вид конфига - достаточно положить на сервер .htaccess с соответствующим именем (+ файл конфига создать).
У вас же придется править код, что не есть хорошо, особенно для работы в команде.


