alexya-framework / router
Alexya 的路由工具
Requires
- php: >=7.0
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
或使用 die
或 exit
结束脚本执行。
示例
<?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