Вступление
Система, разработанная мною, имеет схожую структуру с фреймворком Symfony. Изначально была написана как базис для любой последующей разработки.
Когда-то прочитал мнение, которое меня развеселило и имело оно примерно такой смысл: «Компьютеры стали мощнее и мы начали компенсировать это фреймворками». Выходом из этой ситуации, по-моему, было написание такого «костяка», который позволит с легкость организовать маршрутизацию и модуляцию сайта.
Хочу сказать, что это не является альтернативой Symfony framework, а лишь моим взглядом на решение мелких задач.
1. Модульная система
На данный момент файловая структура сайта будет иметь такой вид:
- engine
- app
- app.php
- controller.php
- load.php
- modules
- moduleName
- action
- action.php
- template
- indexSuccess.php
- action
- moduleName
- view
- html.php
- config.php
- app
- index.php
- development.php
Приложение
engine/app/app.php
<?php
require 'engine/config.php';
require 'load.php'; #подгрузка шаблона метода
require 'controller.php'; #контроллер
$controller = new Controller(); #инициализируем контроллер
$ownTemplate = false; #используем стандартный шаблон
$controller->InitModule($_GET["module"], $_GET["action"]); #инициализируем модуль
Контроллер
engine/app/controller.php
<?php
class Controller extends Load{
private $modules, $methods, $load, $head;
function __construct() { #находит все модули и проверяет возможно ли его вызвать
$this->load = new Load();
foreach(scandir(ROOT.'/engine/modules', 1) as $object) {
if(is_dir(ROOT.'/engine/modules/'.$object) && ($object != '.') && ($object != '..')) {
$this->modules[] = strtolower($object);
}
}
}
function InitHead($module) { #вывод родительный шаблон
$heads['content'] = $module;
$this->load->view(ROOT.'/engine/view/html.php', $heads);
}
#функция выводит буфер модуля в <i>родительный шаблон</i>
function InitModule($module, $action='index') {
global $ownTemplate;
if(in_array($module, $this->modules)) {
require ROOT.'/engine/modules/'.$module.'/action/action.php';
$this->methods = get_class_methods($module); #получаем все возможные методы модуля
if(in_array($action, $this->methods)) { #проверяем принадлежит ли вызванный метод модулю
$variables = call_user_func($module.'::'.$action, $req); #вызываем метод
$moduleReady = $this->load->template(ROOT.'/engine/modules/'.$module.'/template/'.$action.'Success.php', $variables); #отображаем view
if(!$ownTemplate) { #если модуль требует отдельный шаблон
$this->InitHead($moduleReady);
} else {
echo $moduleReady;
}
} else {
die('Error');
}
} else {
die('Error');
}
}
}
При помощи данного контроллера мы инициализируем модуль подключаем родительный шаблон.
Погрузчик вида
engine/app/load.php
<?php
class Load{
function view($file_name, $data = null) {
if(is_array($data)) {
extract($data);
unset($data);
}
include $file_name;
}
function template($file_name, $data = null) {
if(is_array($data)) {
extract($data);
unset($data);
}
ob_start();
include $file_name;
return ob_get_clean();
}
}
index.php, development.php
index.php
<?php
include 'engine/app/app.php'; #все просто
development.php
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
include 'engine/app/app.php';
Родительный вид
Просто выводим буфер модуля в нужном месте
engine/view/html.php
text
<?php echo $content; ?>
text
Модули
engine/modules/moduleName/action/action.php
<?php
class moduleName { #должен быть идентичен названию модуля(папки)
function index() {
$answer = array();
$answer['test'] = 'My test text';
return $answer;
}
}
engine/modules/moduleName/template/indexSuccess
some text
<?php echo $test; #ассоциативный ключ массива $answer ?>
some text
to be continued...
Данная система есть только примером и вытяжкой из уже существующей системы, которая имеет гораздо большие габариты и функционал. Надеюсь на внимание общества и в результате написания продолжения данной статьи с описанием маршрутизации и усовершенствования системы.
Автор: spein