Организация модульности для сайта

в 13:37, , рубрики: mvc, php, метки: ,

Вступление

Система, разработанная мною, имеет схожую структуру с фреймворком Symfony. Изначально была написана как базис для любой последующей разработки.

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

Хочу сказать, что это не является альтернативой Symfony framework, а лишь моим взглядом на решение мелких задач.

1. Модульная система

На данный момент файловая структура сайта будет иметь такой вид:

  • engine
    • app
      • app.php
      • controller.php
      • load.php

    • modules
      • moduleName
        • action
          • action.php

        • template
          • indexSuccess.php
    • view
      • html.php
    • config.php

  • 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js