Пишем простейший роутинг

от
PHP/MySQL    php, routing

Доброго времени суток, %username%! Сто лет ничего не писал и столько же лет выходят статьи на эту тему, но все же, я оставлю это здесь

Итак, чем же мы займемся? Мы напишем роутинг в стиле скелетона.

Что же такое роутинг и с чем его едят:

Вот, что говорит вики на этот счет - Routing) — процесс определения маршрута следования информации в сетях связи. Маршруты могут задаваться административно (статические маршруты), либо вычисляться с помощью алгоритмов маршрутизации, базируясь на информации о топологии и состоянии сети, полученной с помощью протоколов маршрутизации (динамические маршруты).
Маршрутизация — Википедия
https://ru.wikipedia.org/wiki/Маршрутизация


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

Для готовки маршрутизатора нам понадобятся следующие ингредиенты:

1. Прямые руки (2шт.)(при кривизне выпрямить в заборе).
2. Более менее внятный блокнот. Советую Notepad++
3. Настроенный локальный сервер/хостинг
4. Терпение.
5. Собсно программист или что-то на него похожее


Приступим. Давайте определим принцип работы нашего роутера!

Создадим файлы и директории:

__DIR__ ->
     index.php
     system ->
         controller ->
           Route.php
         model ->
           Data.php
           View.php


Итак, создадим файл index.php в корне нашего сайта, он будет точкой входа:
  1. <?php
  2. // index.php
  3.  
  4. //Разрешение на вызов файлов только из одной точки входа.
  5. define("ACCESS",true);
  6.  
  7. //Создаем константу стартового пути
  8. define("PATH",__DIR__);
  9.  
  10. //Подключаем файл прелоадер
  11. include_once PATH."/system/bootstrap.php";
  12.  
  13. //Создаем экземпляр роутера
  14. $route = new Route();
  15.  
  16. //Запускаем роутер
  17. $route->run();
  18. ?>

Создадим прелоадер
  1. <?php
  2. // bootstrap.php
  3.  
  4. //Проверяем был ли вызван файл системой или напрямую. Перенаправляем на главную
  5. defined("ACCESS")or die(header("location:../index.php"));
  6.  
  7. //Создаем константы
  8.  
  9. //Системные файлы
  10. define("SYSTEM",PATH."/system");
  11. //Модели
  12. define("MODEL",SYSTEM."/model");
  13. //Контроллеры
  14. define("CONTR",SYSTEM."/controller");
  15. //Виды
  16. define("VIEW",SYSTEM."/view");
  17.  
  18. //Подгружаем все файлы
  19.  
  20. //Файл данных
  21. include_once MODEL."/Data.php";
  22. //Работа с видами
  23. include_once MODEL."/View.php";
  24. //Контроллер
  25. include_once CONTR."/Route.php";
  26. ?>

Создадим файл данных
  1. <?php
  2. //Data.php
  3. //Проверяем был ли вызван файл системой или напрямую. Перенаправляем на главную
  4. defined("ACCESS")or die(header("location:../index.php"));
  5.  
  6. class Data{
  7.  
  8.     public $data;
  9.  
  10.     function __construct() {   
  11.         $this->data = array(
  12.             "pages" => array(
  13.                 // Именованный массив, чтобы была возможность шифровать роутинг
  14.                 "index"   => "index",
  15.                 "default" => "index",
  16.             ),
  17.         );
  18.     }
  19. }
  20. ?>

Создаем файл роутера
  1. <?php
  2. //Route.php
  3. //Проверяем был ли вызван файл системой или напрямую. Перенаправляем на главную
  4. //Роутером будет $_GET['r'] и будет иметь вид index.php?r=
  5. defined("ACCESS")or die(header("location:../index.php"));
  6.  
  7. class Route{
  8.  
  9.     private $page;
  10.  
  11.     public function run(){
  12.         $data = new Data();
  13.         //Проверяем, использован ли наш роутер
  14.         if(isset($_GET['r'])){
  15.             //Проверяем, есть ли такой маршрут
  16.             if(array_key_exists(htmlspecialchars(stripslashes(trim($_GET['r']))),$data->data["pages"])){
  17.                 //Если есть, определяем $page именем метода
  18.                 $this->page = $data->data["pages"][htmlspecialchars(stripslashes(trim($_GET['r'])))];
  19.             }else{
  20.                 //Если нет маршрута, используем дефолтный
  21.                 $this->page = $data->data["pages"]["default"];
  22.             }
  23.         }else{
  24.             //Если не использован роутер, перенаправляем на главную
  25.             $this->page = $data->data["pages"]["default"];         
  26.         }
  27.  
  28.         //Собираем метод. Он будет иметь вид self::action_ROUTEGETNAME()
  29.         $page = $this->page;
  30.         $methodname = "action_$page";
  31.         self::$methodname();
  32.     }
  33.  
  34.     //Создаем метод загрузки главной
  35.     public static function action_index(){ 
  36.         //Инициализируем модель вида
  37.         $view = new View();
  38.  
  39.         //Загружаем вид
  40.         $view->load("index");
  41.     }
  42. }
  43. ?>

Создадим файл загрузки видов
  1. <?php
  2. //View.php
  3. //Проверяем был ли вызван файл системой или напрямую. Перенаправляем на главную
  4. defined("ACCESS")or die(header("location:../index.php"));
  5.  
  6. class View{
  7.  
  8.     public function load($name){
  9.         $path = VIEW."/$name.html";
  10.  
  11.         //Проверяем есть ли такой вид. Если есть, подрубаем
  12.         if(file_exists($path)){
  13.             require_once($path);
  14.         }else{
  15.             //Иначе загружаем дефолтный вид
  16.             $data = new Data();
  17.             $path = VIEW."/".$data->data["pages"]["default"]."html";
  18.             require_once($path);
  19.         }
  20.     }
  21. }
  22. ?>

Вот, наверное и все =) Спасибо, за прочтение стольких многих букафф
  • +3
  • views 29212