Конфигурирование

Прежде всего, следует различать конфигурирование приложения и конфигурирование модулей. В конфиг приложения обычно выносят, например, параметры подключения к базе данных, настройки кеша, авторизацию, емейлы и т.п. Т.е. конфигурирование приложения определяет его взаимодействие с внешним миром, не изменяя само приложение. Конфигурирование модулей - это нечто более фундаментальное, оно может изменить не только поведение приложения, но и вообще его состав. Однако, строгого деления ответственности между тем и другим не существет - при разработке программист может один и тот же параметр вынести как в конфигурацию модуля, так и в конфигурацию приложения.

Конфигурирование приложения

Приложению конфиг доступен через вызов функции 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.

06.02.2014
Все статьи