С задачей роутинга сталкивается каждый разработчик. От простейшего 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 шаблона.