С задачей роутинга сталкивается каждый разработчик. От простейшего modrewrite в .htaccess мы переходим к разбору адресов непосредственно в коде сайта. Чтобы сэкономить время на решение еще не решенных задач, можно использовать простой в использовании php-роутер AltoRouter, распространяемый по лицензии MIT и который вы найдете на github. Router Alto можно использовать для построения сайтов с использованием MVC паттерна.
Alto Router - это готовый php класс, который можно подключить к приложению и использовать при построении системы роутинга.
Установка может быть выполнена при помощи composer, но также можно просто скачать единственный файл AltoRouter.php и подключить его к приложению.
require 'AltoRouter.php';
Вэб-сервер должен быть настроен на переадресацию всех адресов на index.php. Настройки для Apache в файле .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
Если вы используете сервер Nginx, нужно сделать настройки в файле nginx.conf.
try_files $uri /index.php;
Установка завершена.
Если вы используете autoloader, то достаточно указать для него путь расположения файла AltoRouter.php
Создаем объект класса AltoRouter
$router = new AltoRouter();
Для тех, кто использует виртуальный хостинг и не имеет возможности самостоятельной настройки сервера, будет полезной функция SetBasePath, которая позволяет использовать другой каталог для корня сайта.
$router->setBasePath('/new-root-path/');
Далее настраиваем маршруты (mapping)
$router->map( 'GET', '/', 'render_home', 'home' );
Первый параметр фукции map $method (string) может принимать значения GET, POST, PATCH, DELETE, PUT. Таким образом, мы избавляемся от необходимости проверять условия на наличие переменных в суперглобальных массивах, а сразу переходить к обработке данных из форм.
Второй параметр $route (string) представляет собой адрес страницы, который может быть выражен предопределенным регулярным выражением (predefined regex) или пользовательским регулярным выражением (custom regex). Примеры маршрутов:
Маршрут Route | Пример разбора | Переменные |
---|---|---|
/about/ |
/about/ |
|
/catalog/[i:id]/ |
/catalog/234/ |
$id: 234 |
/[a:c]/[a:a]?/[i:id]? |
/controller/action/12 |
$c: "controller", $a: "action", $id: 12 |
Третий параметр $target может быть callback - функцией, вызываемой при определенном маршруте или строковой переменной, содержащей пару контроллер-экшн, например SomeController#action.
Четвертый параметр $name необязательный и может быть использован на усмотрение пользователя.
Для получения результата разбора нужно выполнить только одну функцию
$match = $router->match();
В результате получаем объект $match, содержащий в свойствах все вышеуказанные параметры, к которым можно получить доступ, например
$match['target']
Переменные, полученные в результате работы регулярного выражения, находятся в свойстве params:
$match['params']['id']
Значения переменных контроллер-экшн можно получить разбиением строки, содержашейся в переменной $target (SomeController#action) , например:
list( $controllerName, $methodName ) = explode( '#', $match['target'] );
Значения из объекта $match можно использовать в дальнейшем, например, в приложениях на основе MVC шаблона.