Конфигурирование
Прежде всего, следует различать конфигурирование приложения и конфигурирование модулей. В конфиг приложения обычно выносят, например, параметры подключения к базе данных, настройки кеша, авторизацию, емейлы и т.п. Т.е. конфигурирование приложения определяет его взаимодействие с внешним миром, не изменяя само приложение. Конфигурирование модулей - это нечто более фундаментальное, оно может изменить не только поведение приложения, но и вообще его состав. Однако, строгого деления ответственности между тем и другим не существет - при разработке программист может один и тот же параметр вынести как в конфигурацию модуля, так и в конфигурацию приложения.
Конфигурирование приложения
Приложению конфиг доступен через вызов функции CMS::cfg(), которая возвращает дерево параметров в виде объекта. Допускается обращаться к параметрам непосредственно:
$db_dsn = CMS::cfg()->db->dsn;
В случае, если такой параметр отсутствует, будет возвращен null.
Устанавливаются эти параметры в конфигурационных файлах. Их два:
- app/config/site.php - здесь собраны параметры, которые не зависят от хостингового сервера.
- config/site.php - параметры, которые меняются от того, на каком сервере находится приложение.
Для чего так сделано? Обычно разработчик сайта оперирует по меньшей мере двумя серверами: "девелоперским", на котором ведется разработка и тестирование, и "боевым", сайт на котором видят обычные посетители сайта. А в сложных случаях "девелоперских" серверов может быть гораздо больше (зависит от особенностей техпроцесса). И часто требуется разделить параметры конфигурации на две группы: те, которые одинаковы на всех версиях (и на "девелоперской" и "боевой"), и те, которые меняются в зависимости от сервера.
Как разделять параметры по этим двум конфигам? Однозначного рецепта нет - все зависит от особенностей конкретного проекта. Разработчик волен вообще ничего не разделять и собрать все параметры в одном из файлов, если так будет удобнее для поддержки проекта.
По умолчанию в файл app/config/site.php вынесены настройки системы администрирования.
Синтаксис конфигурационного файла
Давайте заглянем в типовой конфигурационный файл (config/site.php):
<?php $this ->db ->dsn('mysql://dbuser:dbpassword@localhost:3306/dbname') ->end ->cache ->dsn('fs://../cache') ->timeout(10000) ->end ->iofs ->dir_mod(0777) ->file_mod(0666) ->end ;
Немного нестандартное форматирование применено здесь специально для лучшей читабельности и более удобной поддержки. Как видим, параметры разбиты на группы как в обычном INI-файле, но, в отличие от INI-файла, здесь допускается неограниченная вложенность, а также можно использовать выражения в обычном PHP-синтаксисе. Группа от параметра отличается лишь тем, что параметр представляет собой вызов функции. Имена группам и параметрам можно давать любые кроме зарезервированных слов: begin, end, load, а также прочих стандартных для PHP.
Для примера добавим группу с дополнительным уровнем вложенности:
->mygroup ->myparam(1) ->mysubgroup ->mysubparam(2) ->end ->end
А теперь обратимся к парметру из любого места нашего проекта:
print CMS::cfg()->mygroup->mysubgroup->mysubparam;
Конфигурирование модулей
Конфигурирование модулей представляет собой возможность задать массив параметров, который будет передан в функцию initialize модуля при его загрузке. Что будет делать с этим массивом модуль - на совести разработчика модуля. На этот счет не существует строгих предписаний, модуль может даже полностью проигнорировать переданное.
Параметры для модулей определяются в файле app/config/modules.php. В отличие от вышеописанных конфигов, здесь - формат обычного PHP-массива, в котором ключами являются имена модулей, а значениями - параметры, передаваемые в функцию initialize. По умолчанию этот файл почти пуст:
<?php return array( 'CMS' => array( ), );
Но вот пример не пустого конфига:
<?php return array( 'CMS' => array( 'default_lang' => 'en', 'root_exception_catcher' => 'App.ExceptionCatcher', ), 'Digest' => array( 'password_salt' => '...', ), 'Text.Parser.Wiki' => array( 'url_callback' => function($url) { return WS::env()->urls->articles->view_url($url); }, ), );
Другой вариант задать параметры для модулей - вызвать функцию Core::configure непосредственно в файле www/index.php сразу после Core::initialize:
include('../tao/lib/Core.php'); Core::initialize(); Core::configure(array( 'CMS' => array( // ....... ), ));
В качестве аргумента в функцию Core::configure передается тот же самый массив, который возвращается в файле app/config/modules.php.