bybzmt/router

一个快速的PHP路由器

v1.0.3 2021-12-29 05:06 UTC

This package is auto-updated.

Last update: 2024-09-04 08:12:59 UTC


README

一个简单快速的PHP路由器

特性

  • 静态路由模式
  • 动态路由模式
  • 支持 GETPOSTPUTDELETEOPTIONSPATCHHEAD 请求方法
  • 支持 X-HTTP-Method-Override 头部
  • 允许 :Class.Method 调用
  • 自定义404处理
  • 反向路由器

先决条件/要求

  • PHP 5.3 或更高版本
  • URL重写

安装

可以使用 Composer 进行安装

composer require bybzmt/router

使用

// Require composer autoloader
require __DIR__ . '/vendor/autoload.php';

// Create Router instance
$router = new \Bybzmt\Router\Router();

// Define routes
// ...

// Run it!
$router->run();

路由

使用 $router->handle(method(s), pattern, function)

$router->handle('GET|POST', 'pattern', function() { … });
//or
$router->handle('GET|POST', 'pattern', ':Class.Method');

提供单请求方法的缩写

$router->get('pattern', function() { /* ... */ });
$router->post('pattern', function() { /* ... */ });
$router->put('pattern', function() { /* ... */ });
$router->delete('pattern', function() { /* ... */ });
$router->options('pattern', function() { /* ... */ });
$router->patch('pattern', function() { /* ... */ });
//all methods
$router->all('pattern', function() { /* ... */ });

路由模式

  • 静态路由模式 实际上是 URI,例如 /about
  • 动态路由模式 是类似于 URI 的 Perl 兼容正则表达式 (PCRE),例如 /movies/(\d+)

动态路由模式中定义的子模式被转换为参数,传递给路由处理函数。先决条件是这些子模式需要定义为括号内的子模式,这意味着它们应该被括号包裹

// Bad
$router->get('/hello/\w+', function($name) {
    echo 'Hello ' . htmlentities($name);
});

// Good
$router->get('/hello/(\w+)', function($name) {
    echo 'Hello ' . htmlentities($name);
});

:Class.Method 调用

我们可以像这样路由到类动作

$router->get('/(\d+)', ':User.showProfile:id');

自定义404

使用 $router->set404(function) 覆盖默认的 404 处理程序

$router->set404(function() {
    header('HTTP/1.1 404 Not Found');
    // ... do something special here
});

反向路由器

$router = new \Bybzmt\Router\Router();
$router->get('/news/(\d+)', ':news.show:id');

$tool = new \Bybzmt\Router\Tool($router->getRoutes());
$data = $tool->convertReverse();

$reverse = new \Bybzmt\Router\Reverse($data);

//echo /news/1234
echo $reverse->buildUri('news.show', ['id'=>1234]);

缓存数据

存储数据(file1.php)

$router = new \Bybzmt\Router\Router();
$router->get('/a1', ':example.test');
$router->get('/a2/(\d+)', ':example.test:k1');
$router->get('/a3/(\d+)/(\d+)', ':example.test:k1:k2');

$tool = new \Bybzmt\Router\Tool($router->getRoutes());

//Cache Router Data
$code = $tool->exportRoutes();
file_put_contents('routes_cache.php', $code);

//Cache Reverse Router Data
$code = $tool->exportReverse();
file_put_contents('reverse_cache.php', $code);

恢复数据(file2.php)

//Recovery Router Data
$router = new \Bybzmt\Router\Router(require 'routes_cache.php');

//Recovery Reverse Router Data
$reverse = new \Bybzmt\Router\Reverse(require 'reverse_cache.php');

感谢

许可证

Apache-2.0