Пример организации конфигураций на 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