PHRoute — отличная библиотека, которая обеспечивает быструю реализацию маршрутизатора на основе регулярных выражений. В худшем случае PHRoute примерно в 40 раз быстрее, чем Laravel-роутер.
Установка через Composer
{
"name": "mark/test-router",
"type": "project",
"require": {
"phroute/phroute": "^2.1"
},
"license": "mit"
}
Конфигурация Apache (.htaccess)
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
Конфигурация Nginx
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Базовый код index.php
get('/', function(){
return 'Like at Home!';
});
$router->get('hello', function(){
return 'Hello, PHRoute!';
});
$dispatcher = new Dispatcher($router->getData());
try {
$response = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'],
processInput($_SERVER['REQUEST_URI']));
} catch (Phroute\Exception\HttpRouteNotFoundException $e) {
var_dump($e);
die();
} catch (Phroute\Exception\HttpMethodNotAllowedException $e) {
var_dump($e);
die();
}
processOutput($response);
?>
Маршрут с параметром
$router->get('author/{id}', function($id){
$db = getPDOInstance();
$sql = 'SELECT * FROM `authors` WHERE `id` = :id';
$st = $db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$st->execute(array(':id' => $id));
$result = $st->fetchAll(PDO::FETCH_CLASS);
return $result;
});
Маршрут с необязательным параметром
$router->get('books/{category_id}?', function($category_id = null){
$db = getPDOInstance();
if($category_id == null) {
$sql = 'SELECT * FROM `books`;';
$params = array();
} else {
$sql = 'SELECT * FROM `books` WHERE `category_id` = :category_id;';
$params = array(':category_id' => $category_id);
}
$st = $db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$st->execute($params);
$result = $st->fetchAll(PDO::FETCH_CLASS);
return $result;
});
HTTP методы и фильтры
$router->get($route, $handler); // GET запросы $router->post($route, $handler); // POST запросы $router->delete($route, $handler); // DELETE запросы $router->any($route, $handler); // Все методы
$router->filter('logged_in', function(){
if(!$_SESSION['user_id']){
header('Location: /login');
return false;
}
});
$router->post('book', function(){
// код маршрута
}, array('before' => 'logged_in'));
Группировка маршрутов
$router->group(array('before' => 'logged_in'), function($router){
$router->post('book', function(){
// код добавления книги
});
$router->post('author', function(){
// код добавления автора
});
$router->post('category', function(){
// код добавления категории
});
});
Контроллеры
controller('author', 'Author');