armaaar/mini-router

基于正则表达式的快速PHP路由器

dev-master 2024-09-06 18:42 UTC

This package is auto-updated.

Last update: 2024-09-06 18:42:30 UTC


README

mini-router是一个基于正则表达式且灵感来源于PHRoute的快速PHP路由器。它主要是为了支持RESTful API而构建的,拥有简单但强大的高速接口。

安装

通过composer安装或直接在索引页面包含src/MiniRouter.php文件并开始使用。

友好URL

为了通过路由器处理所有请求,您需要将所有请求重定向到您想定义路由的页面。如果您使用的是Apache且启用了mod_rewrite,请在根目录下创建一个简单的.htaccess文件。

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_URI} !\..+$
RewriteRule .* index.php [QSA,L]

查看示例以了解实现方法。

使用

定义路由

mini-router支持GET、HEAD、POST、PUT、PATCH和DELETE方法。

use MiniRouter\MiniRouter;

$router = new MiniRouter();

$router->get($route, $handler);     # match only get requests
$router->post($route, $handler);    # match only post requests
$router->put($route, $handler);     # match only put requests
$router->delete($route, $handler);  # match only delete requests
$router->patch($route, $handler);   # match only patch requests
$router->head($route, $handler);    # match only head requests
$router->any($route, $handler);     # match any request method

$router->start_routing();

这些方法由路由必须匹配的HTTP方法定义,并接受路由模式和可调用的处理程序,这可以是闭包、函数名或['ClassName', 'method']对。

请注意,路由器默认不会回显处理程序返回的值,因此如果您想向客户端发送某些内容,您需要使用echo而不是return

正则表达式快捷方式

URL可以直接在URL中使用正则表达式或使用以下快捷方式之一

{:i}  => ([0-9]+)              # numbers only
{:a}  => ([0-9A-Za-z]+)        # alphanumeric
{:h}  => ([0-9A-Fa-f]+)        # hex
{:s}  => ([a-zA-Z0-9+_\-\.]+)  # alphanumeric and + _ - . characters

以下是在路由中使用正则表达式和快捷方式的示例

  // you can pass parameters to controllers through URL using shortcuts
  $router->get('/hello/{:a}/', function($name) {
    echo "Hello, $name!";
  });

  // or you can use regular expressions directly into the URL
  $router->get('/hello-robot/(\d+)', function($robotNumber) {
    echo "Hello robot number $robotNumber!";
  });

  // URL parameters assigned to controller parameters in order
  // Note that regex can be used side by side with shortcuts
  $router->get('/hello-two/{:s}/([a-zA-Z0-9+_\-\.]+)', function($name1, $name2) {
    echo "Hello, $name1 and $name2!<br>";
  });

  // Parameters could be optional but you need to define default values for it's corresponding variables
  $router->get('/hello-anon/{:a}?/', function($name = "anonymous") {
    echo "Hello, $name!";
  });

反向路由的命名路由

传递一个数组作为第一个参数,其中第一个元素是您的路由,第二个元素是稍后引用它的名称。

$router->get(['/user/{:a}', 'username'], function($name){
    echo 'Hello ' . $name;
});

$router->get(['/page/{:s}/{:i}', 'page'], function($slug, $id){
    echo 'You must be authenticated to see this page: ' . $id;
});

// Use the route name and pass any route parameters to redirect the browser to existing route path
// If you change your route path above, you won't need to go through your code updating any links/references to that route
$router->route('username', 'joe');
// this will redirect the browser to the path '/user/joe'

// if you passed a false value to the third argument, the browser will call the handler of the specified route without redirecting
$router->route('page', ['intro', 234], false);
// this will call the handler of the path '/page/intro/234'

分组

分组应用于URL的前缀。

$router->group('/admin', function($router){

    $router->get('pages', function(){
        echo 'page management';
    });

    $router->get('products', function(){
        echo 'product management';
    });

    $router->get('orders', function(){
        echo 'order management';
    });
});

分组还可以在URL中定义参数,默认情况下,在分组中定义的参数也传递给所有分组路由。

$router->group('/api/v{:i}', function($router, $api_version){

    $router->get('users', function($version){
        echo $version;
    });

    if ($api_version >= 2) {
        $router->get('order/{:i}', function($api_version, $order_id){
            echo $api_version;
        });
    }
});

值得注意的是,路由器在所有路由的开头仅添加域名。因此,如果您的所有路由都在子文件夹或子目录中,请使用文件夹名称作为前缀将所有路由分组。

过滤器

您可以在访问路由之前添加一个必须为真的过滤器。

$router->filter('isLoggedIn', function(){
    if($_SESSION['logged_in']) {
      return true
    } else {
      return false
    }
});

$router->get('/user/{:a}', function($name){
    echo 'Hello ' . $name;
}, "isLoggedIn");

如果过滤器返回任何假值,它将阻止路由处理程序的调度。您可以从PHP布尔类型文档中检查假值。

过滤器分组

将多个路由包裹在一个路由组中,以将过滤器应用于定义在其中的每个路由。如果需要,可以嵌套组。

$router->filter('auth', function(){
    if(!isset($_SESSION['user']))
    {
        $router->route('login');
        return false;
    }
    return true;
});

$router->group('/portal', function($router){

    $router->get('/user/{:a}', function($name){
        echo 'Hello ' . $name;
    });

    $router->get('/page/{:i}', function($id){
        return 'You must be authenticated to see this page: ' . $id;
    });

}, "auth");

$router->get(['/login', 'login'], function($name){
    echo 'Please login...'
});

查看示例以获取mini-router的更详细的实际使用示例,特别是对于RESTful API。

许可证

License: MIT