[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Курс "MVC от теории к практике"
Alehandr
Configurator

Всем привет!
Перед тем, как приступать к основным классам нам осталось написать необходимый для нас класс Конфигуратора, который будет выполнять загрузку и сохранение конфигурации. Самый лучший и быстрый вариант загрузки конфига - инклуд php файла. Есть 2 варианта: либо пишем классы (на подобии DataBase_Config), либо возвращаем массив значений. Для 1 варианта нам понадобится куда больше сил для сохранения, а для 2 мы можем использовать встроенные функции. Чего-же мы ждем, приступим:

Configurator (core/classes/configurator.php):
<?php if (!defined('APP')) die('Access is forbidden!!!');

class Configurator_Core {

/**
* Загрузка конфигурации
*
*
@param string $name
*
@return mixed
*/

public static function Load($name) {
if (is_file(APP . 'config' . DS . $name . EXT)){
return include(APP . 'config' . DS . $name . EXT);
}
if (is_file(CORE . 'config' . DS . $name . EXT)){
return include(CORE . 'config' . DS . $name . EXT);
}
return array();
}

/**
* Сохранение конфигурации
*
*
@param string $name
*
@param mixed $array
*/

public static function Save($name, $array) {
file_put_contents(APP . 'config' . DS . $name . EXT,
"<?php if (!defined('APP')) die('Access is forbidden!!!');\n\nreturn " .
preg_replace_callback("/\n([\s]+)/ui", array('Configurator', 'SaveCallback'), var_export($array, true)) .
";\n");
}

private static function SaveCallback($matches) {
return "\n" . str_replace(" ", "\t", $matches[1]);
}

}


if (!defined('CONFIGURATOR_CLASS')) {
class Configurator extends Configurator_Core { }
}

Как видите, конфигуратор сначала ищет файлы в папке приложения, а если его там нет, в папке движка. Это сделано для возможности создания конфигураций по умолчанию, подходящих для многих проектов.

Чтож, остается только протестировать. Изменим временно файл index.php:
<?php

define('DS', DIRECTORY_SEPARATOR); //Только для сокращения
define('EXT', '.php'); //Расширение php файлов

define('APP', realpath(dirname(__FILE__)) . DS . 'app' . DS); //Корневая директория приложения
define('CORE', realpath(dirname(__FILE__)) . DS . 'core' . DS); //Корневая директория системных классов
define('MODS', realpath(dirname(__FILE__)) . DS . 'modules' . DS); //Корневая директория модулей

require(CORE . 'exceptions' . EXT); //Импортируем исключения
require(CORE . 'functions' . EXT); //Импортируем функции ядра (__autoload)

Starter::Run(); //Запускаем приложение...

//----------------------------


Configurator::Save('test', array(
'key' => 'Hello my friends!!!',
'array' => array(
1, 2, 3, 4, 5, 6, 7, 8, 9,
'a' => 'b',
),
));

Запустим сайт. Ошибок нет, уже хорошо. Ну а теперь проверим наличие файла test.php в папке app/config:
<?php if (!defined('APP')) die('Access is forbidden!!!');

return array (
'key' => 'Hello my friends!!!',
'array' =>
array (
0 => 1,
1 => 2,
2 => 3,
3 => 4,
4 => 5,
5 => 6,
6 => 7,
7 => 8,
8 => 9,
'a' => 'b',
),
);

Все нормально...

Попробуем загрузить конфигурацию (index.php):
<?php

define('DS', DIRECTORY_SEPARATOR); //Только для сокращения
define('EXT', '.php'); //Расширение php файлов

define('APP', realpath(dirname(__FILE__)) . DS . 'app' . DS); //Корневая директория приложения
define('CORE', realpath(dirname(__FILE__)) . DS . 'core' . DS); //Корневая директория системных классов
define('MODS', realpath(dirname(__FILE__)) . DS . 'modules' . DS); //Корневая директория модулей

require(CORE . 'exceptions' . EXT); //Импортируем исключения
require(CORE . 'functions' . EXT); //Импортируем функции ядра (__autoload)

Starter::Run(); //Запускаем приложение...

//----------------------------


$conf = Configurator::Load('test');
echo "<br />{$conf['key']}";

Все работает!!! smile.gif

На этом лекция заканчивается. Не забудьте подчистить index.php и удалить тестовый файл конфигурации...



Спустя 7 часов, 55 минут, 53 секунды (27.11.2009 - 19:08) VolCh написал(а):
Цитата
Как видите, конфигуратор сначала ищет файлы в папке приложения, а если его там нет, в папке движка. Это сделано для возможности создания конфигураций по умолчанию, подходящих для многих проектов.

А не лучше сделать как-то так: конфигуратор запускает сначала конфиг из папки движка (с дефолтными параметрами), а потом из папки приложения переопределят те, из них, которые в приложени не дефолтные? В общем как наследование классов smile.gif

А вообще вопрос - почему для хранения конфигов применяются не очень "гуманные" форматы? Есть ведь множество других форматов (навскидку - INI, XML, YAML), которые удобно использовать (пускай и не очень удобно парсить).

Спустя 13 часов, 42 минуты, 37 секунд (28.11.2009 - 08:51) Alehandr написал(а):
VolCh
На счет наследования: сделать можно, а возможно даже и нужно. Вот и задание. Кто сделает?

На счет INI, XML, YAML, JSON и прочих - время работы скрипта увеличится... Да и чем формат массива неудобно использовать?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.