kento-oka/roust

此包已被弃用且不再维护。作者建议使用 fratily/router 包。

Roust 是最快的(期望的)URI 路由器

v0.3.1 2017-12-12 01:26 UTC

This package is auto-updated.

Last update: 2022-02-01 13:11:11 UTC


README

注意:
此库已迁移到 fratily/router。从现在开始请使用那个。

Roust 是最快的(期望的)URI 路由器。

备注:
我不会说英语。所以我使用了 GoogleTranslate。
确切的 REDME 在 README_origin。

安装

在项目中使用 Roust 之前,请在项目中执行它命令

$ composer require 'kento-oka/roust'

使用方法

首先,创建一个路由器实例。

use Roust\Router;

$router = new Router();

基本用法

use Roust\Router;
use Request;    //  Implemented Psr\Http\Message\ServerRequestInterface

$router     = new Router();
$request    = new Request();

//  It matches GET http://example.com/
$router->addRoute("GET", "/", [
    "controller"    => "index",
    "action"        => "index"
]);

//  It matches GET http://example.com/users/
$router->addRoute("GET", "/users/", [
    "controller"    => "user",
    "action"        => "index"
]);

//  It matches GET http://example.com/users/my/ and POST http://example.com/users/my/
$router->addRoute(["GET", "POST"], "users/my/", [
    "controller"    => "user",
    "action"        => "mypage"
]);

//  It matches GET http://example.com/users/123/
$router->addRoute("GET", "/users/{uid:[1-9][0-9]*}/", [
    "controller"    => "user",
    "action"        => "page"
]);

$result = $router->search($request->getMethod(), $request->getUri()->getPath());

switch($result["result"]){
    case Router::NOT_FOUND:
        // ... 404 Not Found
        break;
    case Router:METHOD_NOT_ALLOWED:
        $allowedMethods = $result["allowed"];
        // ... 405 Method Not Allowed
        break;
    case Router::FOUND:
        $params = $resul["params"];
        //  Do something
        break;
}

定义路由

通过 Router::addRoute() 定义路由规则。

第一个参数是要允许的 HTTP 方法。
第二个参数是要匹配的 URI。
您可以为第三个参数指定其他参数。

您可以在第二个参数中省略前面的斜杠。

//  It matches GET http://example.com/
$router->addRoute("GET", "/", [
    "controller"    => "index",
    "action"        => "index"
]);

//  It matches GET http://example.com/users/
$router->addRoute("GET", "/users/", [
    "controller"    => "user",
    "action"        => "index"
]);

//  It matches GET http://example.com/users/my/ and POST http://example.com/users/my/
$router->addRoute(["GET", "POST"], "users/my/", [
    "controller"    => "user",
    "action"        => "mypage"
]);

定义了 Router::get()Router::post()Router::put()Router::delete() 等方法来省略 HTTP 方法的指定。

$router->get("/users/", [
    "controller"    => "user",
    "action"        => "index"
]);

使用正则表达式

使用 {id:regex} 语法嵌入正则表达式。 id 指定参数名,regex 指定用于 PHP 的 preg_match() 中的正则表达式。

$router->addRoute("GET", "/users/{uid:[1-9][0-9]*}/", [
    "controller"    => "user",
    "action"        => "page"
]);

即使第三个参数中指定了相同的参数名,第二个参数的值也优先。

使用简短的正则表达式

例如,如果您添加一个匹配 IP 地址的路由规则,那么没有人会在 Router::addRoute() 中编写那个正则表达式。此外,如果它是 IPv4 映射的 IPv6 地址,如果在路由阶段转换为 IPv4,则非常有用。

可以实现这种简短的正则表达式。

这是只匹配自然数并将其转换为 int 类型的简短正则表达式

$router->addShortRegex("d", new \Roust\Sregex\NaturalNumber());

$router->addroute("GET", "/users/{uid:|d}/", [
    "controller"    => "user",
    "action"        => "page"
]);

可以通过 Router::addShortRegex() 注册简短的正则表达式。

第一个参数是一个限定名称。
第二个参数将传递实现 Roust\ShortRegexInterface 的类的实例。

分组

到目前为止的示例中,有一些规则是通用的。

以与用户相关的规则为例,URI 的开头必须是 '/users/',而 'controller' 的值必须是 'user'。

使用前面的示例编写通用部分并不困难。但实际上还需要更多的规则。

在 Roust 中,您可以以这种方式总结规则的分组

$router->makePathGroup("/users", function($r){
    $r->get("/", [
        "controller"    => "user",
        "action"        => "index"
    ]);

    $r->makeParamsGroup(["Controller" => "user"], function($r){
        $r->get("/my/", [
            "action"    => "mypage"
        ]);

        $r->get("/{uid:[1-9][0-9]*}/", [
            "action"    => "page"
        ]);
    });
});

Router::makePathGroup() 在第二个参数回调执行期间,将第一个参数的值添加到通过 Router::addRoute() 添加的规则的 URI 的开头。

Router::makeParamsGroup() 中,添加参数。这些添加的参数可以通过 Router::addRoute() 覆盖。

注意

$route->addShortRegex("d", new NaturalNumber());
$router->get("/users/{id:[1-9][0-9]*}/", []);
$router->get("/users/{id:|d}/profile/", []);

$router->search("GET", "/users/123/");          // Not Found
$router->search("GET", "/users/123/profile");   // Found

字符串 > 短正则表达式 > 正则表达式