Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Пример организации конфигураций на 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
  • 2015-08-15 17:28:09