Простой PHP маршрутизатор
Базовым элементом всех современных PHP фреймворков является роутер, по-другому маршрутизатор (Router), который отвечает за вызов контроллера, соответствующего запрошенному url-адресу. Маршрутизаторы, несмотря на все многообразие реализаций, выполняют одну и туже функцию. Далее мы с вами посмотрим на один из вариантов реализации, который похож на те, которые используются в таких популярных PHP фреймворках как Slim, Silex, Laravel и т.д.
Код:
class Router
{
// массив для хранения соответствия url => функция
private static $routes = array();
// запрещаем создание и копирование статического объекта
private function __construct() {}
private function __clone() {}
// данный метод принимает шаблон url-адреса
// как шаблон регулярного выражения и связывает его
// с пользовательской функцией
public static function route($pattern, $callback)
{
// функция str_replace здесь нужна, для экранирования всех прямых слешей
// так как они используются в качестве маркеров регулярного выражения
$pattern = '/^' . str_replace('/', '\/', $pattern) . '$/';
self::$routes[$pattern] = $callback;
}
// данный метод проверяет запрошенный $url(адрес) на
// соответствие адресам, хранящимся в массиве $routes
public static function execute($url)
{
foreach (self::$routes as $pattern => $callback)
{
if (preg_match($pattern, $url, $params)) // сравнение идет через регулярное выражение
{
// соответствие найдено, поэтому удаляем первый элемент из массива $params
// который содержит всю найденную строку
array_shift($params);
return call_user_func_array($callback, array_values($params));
}
}
}
}
Используем следующим образом:
// главная страница вашсайт.рф
Router::route('/', function(){
print 'Домашняя станица';
});
// маршрут будет срабатывать на адрес вашсайт.рф/blog/myrusakov/12091983
// и подобные
Router::route('blog/(\w+)/(\d+)', function($category, $id){
print $category . ':' . $id;
});
// запускаем маршрутизатор, передавая ему запрошенный адрес
Router::execute($_SERVER['REQUEST_URI']);
-
- Михаил Русаков
Комментарии (2):
Расскажите пожалуйста по подробней как происходит вызов контролера действия и самое главное параметров в данном случае
Ответить
C помощью .htaccess файла, который будет перенаправлять все запросы на index.php. Или нужно перенаправить обработку 404 ошибок на файл routing_index.php в файле .htaccess:
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.