Привет всем! Вот и наступила вторая статья из серии, посвященной созданию движка на MVC . Сегодня создадим роутинг . Поехали!

Создание движка на MVC. Пишем роутер.

Привет всем! Вот и наступила вторая статья из серии, посвященной созданию движка на MVC. Сегодня создадим роутинг. Поехали!

Для начала разберемся, как будет работать наш роутинг. У нас будет единая точка входа - index.php. Туда будут отправляться все запросы. URL будет такого вида:

http://site.ru/controller/method/param

Т.е. сначала будет идти контроллер, потом метод, а потом параметры. Этот URL будет разбираться нашим роутером и будет вызываться переданный метод у переданного контроллера с параметрами(если есть).

Думаю, как это будет работать, вы поняли. Теперь откроем файл .htaccess и пропишем следующее:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Разберемся, что мы здесь написали. Сначала включаем движок перезаписи, потом задаем 3 условия: если это не физическая директория, файл или ссылка, то берем весь URL и отправляем на файл index.php(нашу единую точку входа), передав GET параметр url со значением нашего URL.

Теперь что бы вы не ввели в адресную строку, вы всегда будете попадать в файл index.php. Давайте перейдем в этот файл и пропишем следующее:

<?php
  $url = $_GET['url'];
  echo $url;
?>

Теперь вы увидите ваш url. Давайте создадим контроллер index.php в папке controllers.

<?php
  class Index {
   public function __construct() {
    echo "Мы в контроллере INDEX";
   }
  }
?>

Теперь в нашем главном файле index.php подключим его

<?php
  $url = $_GET['url'];
  echo $url;
  require_once 'controllers/'.$url.'.php';
  $controller = new $url;
?>

Теперь мы увидим надпись, которую выводит конструктор нашего класса. Создадим еще один контроллер help.php в папке controllers.

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }
  }
?>

Теперь если в адресной строке после названия сайта(домена) ввести '/help', вы увидите, что сработал контроллер Help.

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

<?php
  $url = $_GET['url'];
  $url = rtrim($url, '/');
  $url = explode('/', $url);
  require 'controllers/'.$url[0].'.php';
  $controller = new $url[0];
  if(isset($url[2])) {
   $controller->$url[1]($url[2]);
  }
  else {
   if(isset($url[1])) {
    $controller->$url[1]();
   }
  }
?>

Вот такой вот получился файл index.php. Сначала мы получаем наш url адрес и записываем его в переменную $url. Дальше наш нужно удалить последний слэш, иначе у нас будет ошибка. Для этого мы воспользовались функцией rtrim, куда первым параметром передаем, что мы хотим удалить, а вторым - где. После, используя функцию explode мы разбиваем нашу строку на массив по слэшу. Теперь первым параметром у нас будет название контроллера, который мы и подключаем строчкой ниже и создаем его объект. Теперь проверяем, есть ли параметры. Если да, то вызываем переданный метод и передаем параметр, а если нет, то просто вызываем наш метод.

Давайте теперь в нашем контроллере help.php создадим метод other.

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }

   public function other() {
    echo "Мы в методе other контроллера Help";
   }
  }
?>

Теперь напишем в адресной строке следующее: ваш_домен.ru/help/other

И у нас вызовится метод other контроллера help.

Теперь изменим наш метод other

<?php
  class Help {
   public function __construct() {
    echo "Мы в контроллере HELP";
   }

   public function other($arg = false) {
    echo "Мы в методе other контроллера Help";
    echo "Параметры: ".$arg;
   }
  }
?>

Теперь в адресной строке браузера напишем так: ваш_домен.ru/help/other/10 В метод передастся 10, и он это выведит.

Итак, вот мы уже и сделали наш роутер рабочим. Конечно, это только начало, но оно уже положено. Дальше будет только интересней. Спасибо за внимание!