Пример организации конфигураций на Yii framework
Настало время рассмотреть один из вариантов хранения конфигураций для yii framework, который поддерживает возможность наследования/переопределения/расширения настроек и вынесение локальных настроек в отдельные файлы с последующим их исключением из git.
Сначала создадим файл с общими настройками protected/config/common.php. В него необходимо вынести конфигурации, которые используются в консольном и web приложении. Например, компоненты кэширования и логирования, общие модули, параметры и подключение к БД. Также добавим в него возможность "переписи" локальными значениями. Должно получиться что-то подобное:
<?php
$commonConfig = array(
'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..',
'name' => 'My Application',
'preload' => array('log'),
'components' => array(
'db' => require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'database.php'),
'log' => array(
'class' => 'CLogRouter',
'routes' => array(
array(
'class' => 'CFileLogRoute',
'levels' => 'error, warning',
),
),
),
),
);
return CMap::mergeArray(
$commonConfig,
file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'common-local.php')
? require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'common-local.php')
: array()
);
protected/config/database.php. Они также поддерживают возможность переопределения значений.<?php
$databaseConfig = array(
'connectionString' => 'mysql:host=localhost;dbname=testdrive',
'emulatePrepare' => true,
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
);
return CMap::mergeArray(
$databaseConfig,
file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'database-local.php')
? require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'database-local.php')
: array()
);
Теперь настало время изменить файл protected/config/console.php, чтобы он расширял наш обший файл конфигураций. Его содержимое будет таковым:
<?php
$consoleConfig = array(
'name' => 'My Console Application',
);
return CMap::mergeArray(
require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'common.php'),
$consoleConfig,
file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'console-local.php')
? require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'console-local.php')
: array()
);
Содержимое файла protected/config/main.php в точности повторяет структуру файла консольной конфигурации. Единственным отличием является свой набор компонентов и модулей, которые применимы только для web приложения. Не будем заострять на нем внимание.
<?php
$mainConfig = array(
'name' => 'My Web Application',
'import' => array(
'application.models.*',
'application.components.*',
),
'modules' => array( ),
'components' => array(
'user' => array(
'allowAutoLogin' => true,
),
'urlManager' => array(
'urlFormat' => 'path',
'rules' => array(
'<controller:\w+>/<id:\d+>' => '/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
'<controller:\w+>/<action:\w+>' => '/',
),
),
'errorHandler' => array(
'errorAction' => 'site/error',
),
),
'params' => array(
'adminEmail' => 'webmaster@example.com',
),
);
return CMap::mergeArray(
require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'common.php'),
$mainConfig,
file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'main-local.php')
? require(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'main-local.php')
: array()
);
Если вы используете git в качестве системы хранения версий, то финальным штрихом будет создание файла .gitignore в директории protected/config в котором мы исключим локальные настройки. Он будет содержать только одну строку:
*-local.php
На этом все. Мы реализовали возможность переопределения/расширения настроек. Ниже представлена схема приоритетов файлов от наименьшего к наивысшему.
Консольное приложение:
- common.php
- common-local.php
- console.php
- console-local.php
Web приложение:
- common.php
- common-local.php
- main.php
- main-local.php
