Код
<?php
define('EXT', '.php');
define('ROOTPATH', realpath(dirname(__FILE__)) . '/');
define('CTRLS', ROOTPATH . 'controllers/');
final class Route
{
/**
* Инициализация массива для хранения маршрутов
*/
protected static $_routes = [];
/**
* Метод установки маршрутов
*/
public static function set($mRegex, $pRegex, $controller, $action)
{
Route::$_routes[] = [
'mRegex' => $mRegex,
'pRegex' => $pRegex,
'controller' => $controller,
'action' => $action,
];
}
/**
* Метод обработки запросов
*/
public static function start($uri)
{
$split = explode('?', (trim($uri, '/'))); // Отделяем GET параметры
foreach(self::$_routes as $item)
{
if(preg_match('/' . $item['mRegex'] . '/', $split[0])) // Подходит ли запрос под регулярку? Если да:
{
$ctrlrPath = CTRLS . $item['controller'] . EXT;
if(is_file($ctrlrPath)) // А существует вообще файл с классом контроллера?
{
require_once($ctrlrPath); // Да? Тогда подключаем.
$controller = new $item['controller']();
$params = [];
if(preg_match('/' . $item['pRegex'] . '/', $split[1])) // подходит ли строка параметров под регулярку?
{
foreach($_GET as $key => $value) // Подходит? Формируем массив параметров...
{
$params[$key] = $value;
}
$controller->$item['action']($params); // Вызываем действие с переданными параметрами.
}
else
{
$controller->$item['action'](); // иначе вызываем действие с параметрами по умолчанию...
}
break;
}
else
{
self::page404(); // Это если не существует файла с классом
}
}
}
if(empty($ctrlrPath))
{
self::page404(); // Если запрос не подошёл не одному маршруту
}
}
/**
* 404-я страница
*/
public static function page404()
{
http_response_code(404);
require_once('page404.php');
exit;
}
}
/**
* Создаём маршруты
*
* 1 параметр - шаблон регулярного выражения для подключения контроллера
* и вызова действия
*
* 2 параметр - шаблон регулярного выражения для передаваемых параметров
* 3 параметр - имя контроллера соответствующего маршруту
* 4 параметр - имя действия соответствующего маршруту
*/
Route::set('^numbers$', 'chars=[0-9]{1,3}&min=[0-9]&max=[0-9]', 'numbers', 'index');
Route::set('^$', '^$', 'standart', 'index'); // Маршрут по умолчанию
/**
* Запуск маршрутизации
*/
Route::start($_SERVER['REQUEST_URI']);
И если не сложно уделить немного времени, подскажите как логика должна развиваться дальше? Вот создал я объект контроллера, вызвал его метод, передал в него параметр(или не передал), а дальше? Прочитал море всего про MVC и это только путаницу создало, одни статьи слишком для меня сложные, в других напротив всё упрощено до уровня роутинга на switch'e. Не пойму как с видами например работать, виды это вообще просто html шаблоны, или это класс такой, вид, и как всё взаимодействует? Объясните на пальцах, по пунктам, это передаём туда то - потому то, подключаем то-то, в таком духе.)