karmabunny / router
路由库
Requires (Dev)
- phpcompatibility/php-compatibility: ^9.3
- phpstan/phpstan: ^0.12.88
- phpunit/phpunit: ^9.5
README
这是一个(稍微有点)有观点的路由器。
观点
许多路径路由器将正则表达式的全部功能提供给路由表。允许编写任何喜欢的咒语。有时是因为懒惰,或者可能他们认为这是必要的。
我相信 路由并不复杂。它们是带有几个简单变量的简单路径模式。
验证这些变量的角色 不 在路由器的手中。这是控制器的角色。例如,需要告知最终用户“这不是有效的ID”。如果你将 '/user/([0-9]+)/view'
作为你的路由,则路由永远不会检测这些无效的ID,用户将收到“页面未找到”。没有帮助。
解决方案
路由“规则”是一种简单语法。
例如 /user/{id}/view/*
大括号 {}
包含变量名。它们遵循PHP变量+正则表达式组名相同的规则。即; [a-z][a-z0-9_]+
。它们仅在路径分隔符之间捕获。值永远不会包含正斜杠 - /
。
通配符 *
稍微宽松一些。它们是无名的,可以包含任何内容。你可以拥有任意多个,但可能会带来非常混乱的结果。
模式
此包提供了三种路由器实现。
1. 分块组
这是一种高效地批量执行路由模式的方法,如这里所述
https://www.npopov.com/2014/02/18/Fast-request-routing-using-regular-expressions.html
2. 简单模式
这是规则模式的基线实现。
3. 正则表达式模式
此模式提供完整的正则表达式引擎作为路由模式。这与块+简单模式中使用的规则模式不兼容。
这是一个 过渡 模式,用于旧项目。我不打算让任何人长时间使用此模式。
安装
使用composer安装
composer require karmabunny/router
使用方法
use karmabunny\router\Router; // Create a router with a config. $router = Router::create([]); // Load some routes. // These are keyed: // [ rule => target ] $routes = include __DIR__ . '/routes.php'; $router->load($routes); // Perform routing. $action = $router->find('GET', '/user/123/edit'); if (!$action) { die('not found'); } // The route target, as defined in the route table. echo $action->target, PHP_EOL; // The path arguments. Keyed by name. Wildcards are always last. echo $action->args, PHP_EOL;
路由表
路由表可以像以前一样手动构建。这是一个指向目标的有键数组。目标通常是可调用的。
这通过 load($routes)
载入路由器。
路由器本身对如何管理目标没有偏好。换句话说,此包包含了一堆假设目标为可调用的实用工具,通常位于控制器中。
路由发现
与其构建路由表,不如尝试 路由发现。这是一种可以将其路由直接编写在其控制器操作旁边的方法。
如下所示
use karmabunny/route/Route; class MyController { #[Route('GET /my/php8/{route}')] public function php8Action() {} /** @route GET /my/php7/{route} */ public function php7Action() {} }
如果您有幸拥有PHP8环境,可以使用新的属性功能!否则,@route
标签始终有效。
操作路由
待办事项
这些是从命名空间生成的路由。
我还没有决定它们将多么 神奇。所有公共方法?还是仅标记方法?或者可能排除某些方法?仅POST/PUT方法带有操作参数和安全令牌?我不知道!
配置
'mode'
- 其中之一:single|chunked|regex'case_insensitive'
- 布尔值'methods'
- 数组有效方法'chunk_size'
- 对于块模式,默认为10
请参阅 src/RouterConfig.php
。
待办事项
- 某种形式的缓存
- ACTION方法?
- 关于Unicode的某些内容?
- 显式方法(POST、GET)在通配符方法之前匹配/排序
- 分块正则表达式模式
- 兼容属性加载器(用于sprout3)
- 将规则语法转换为正则表达式
- 将目标作为
ns\to\class/method/arg1/arg2
插入