Главная/Статьи/PHP: Простой роутинг с помощью библиотеки PHRout
PHP

PHP: Простой роутинг с помощью библиотеки PHRout

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');