kento-oka / roust
Requires
- php: ^7.0
Requires (Dev)
- phpunit/phpunit: ^6.0
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
字符串 > 短正则表达式 > 正则表达式