karmabunny/router

v2.7.14 2023-01-31 06:39 UTC

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 插入