Alexya 的路由工具

安装: 57

依赖者: 1

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:框架

3.1.1 2017-06-05 13:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:04:17 UTC


README

Alexya 的路由组件

内容

实例化 Router 对象

路由器将 HTTP 请求翻译并通过不同的指定回调函数路由,直到有一个可以处理它。

首先,您需要实例化一个路由器对象来路由请求。

构造函数接受一个字符串作为基础路径。

示例

<?php
$Router = new \Alexya\Router\Router();
// will route all requests of `/`
// /forum
// /forum/thread/1
// /blog
// /blog/post/1

$Router = new \Alexya\Router\Router("blog");
// will route all requests of `/blog` (if `/forum` is requested, it will be ignored).
// /blog
// /blog/post/1

添加路由

一旦路由器实例化,您需要添加路由,您可以使用 add 方法来完成此操作。第一个参数是要匹配的正则表达式,第二个参数是在匹配正则表达式时执行的回调函数,第三个参数是包含要测试正则表达式的方法的数组(如果为空,则全局测试)。

有 2 种调用此方法的方式

  • 添加单个路由。
  • 添加多个路由。

添加单个路由

要添加单个路由,您至少需要提供前两个参数

  • 路由器应匹配的正则表达式。
  • 匹配表达式时调用的回调函数。

可选地,您可以发送第三个参数,该参数可以是数组或字符串,该参数将包含应该匹配表达式的函数。

示例

<?php

$Router->add("/blog/post/([0-9]*)", function($id) {
    echo "Requested post: {$id}";
});

$Router->add("/forum/thread/([0-9]*)", function($id) {
    echo "Requested thread: {$id}";
}, ["GET", "POST"]);

添加多个路由

要添加多个路由,您需要提供一个数组参数,该数组包含要匹配的所有路由,数组的每个索引都是一个至少包含 2 个索引的数组

  • 路由器应匹配的正则表达式。
  • 匹配表达式时调用的回调函数。

可选地,您可以添加第三个索引,该索引可以是数组或字符串,该索引将包含应该匹配表达式的函数。

示例

<?php

$Router->add([
    [
        "/blog/post/([0-9]*)",
        function($id) {
            echo "Requested post: {$id}";
        }
    ],
    [
        "/forum/thread/([0-9]*)",
        function($id) {
            echo "Requested thread: {$id}";
        },
        ["GET", "POST"]
    ]
])

匹配路由

一旦添加了所有路由,您需要调用 route 方法,该方法将解析请求并通过所有路由,如果请求匹配路由,则执行其回调函数,如果不匹配,则抛出类型为 \Alexya\Router\Exceptions\NoRouteMatch 的异常。

默认路由

为了避免抛出异常,您可以使用 setDefault 方法,该方法接受要执行的 \Alexya\Router\Route 对象作为参数,如果请求不匹配任何路由。或者,您可以使用 add 方法并发送 {DEFAULT} 作为正则表达式。

示例

<?php
$Router = new \Alexya\Router\Router("blog");

$Router->add("/post/([0-9]*)", function($id) {
    echo "Requested post: {$id}";
}, "GET");

$Router->add("{DEFAULT}", function() {
    echo "The page doesn't exist!";
});

//  |           Request          |         Response       |
//  |----------------------------|------------------------|
//  | GET  /blog/post/           | Requested post:        |
//  | GET  /blog/post/1          | Requested post: 1      |
//  | POST /blog/post/3416321341 | The page doesn't exist |
//  | GET  /blog/post/a          | The page doesn't exist |
//  | POST /post/                | The page doesn't exist |
//  | GET  /post/1               | The page doesn't exist |

链式路由

有时,在单个请求中让多个路由一起工作是个好主意。例如,您可以在一个路由中检查页面是否存在,然后在另一个路由中检查用户是否已登录,然后在另一个路由中加载页面...

\Alexya\Router\Router::route 函数可以接受一个布尔参数,指示路由器是否支持链式路由。

当路由器支持链式路由时,它将遍历所有路由并执行所有匹配的路由,要停止路由器,您可以让路由回调返回 false 或使用 dieexit 结束脚本执行。

示例

<?php

$router = new \Alexya\Router\Router();
$router->add("(.*)", function() {
    echo "Page requested";
});
$router->add("/User/([a-zA-Z]*)", function($user) {
    echo "User {$user}";

    return false; // Exit chain
});
$router->add("/User/([a-zA-Z]*)/(.*)", function($user, $action) {
    echo "User {$user}, action {$action}";
});

$router->route(true);

// Request URI: /User/test/asdf
// Output:
//  Page requested
//  User test