open-core/router

符合PSR-15规范的快速路由中间件,基于预编译的搜索树

1.0.1 2023-04-15 11:19 UTC

This package is auto-updated.

Last update: 2024-09-12 01:05:37 UTC


README

符合PSR-15规范的快速路由中间件,基于预编译的搜索树。

功能

  • 符合PSR-7, PSR-11, PSR-15, PSR-17规范。
  • 基于属性(注解)的路由控制器。
  • 将解析的请求体作为参数传递给控制器方法。
  • 将PSR请求/响应对象传递给控制器方法。
  • 可选控制器方法参数解析为URL查询参数。
  • 根据处理方法签名进行参数和体类型的转换。
  • 路由编译优势
    • 无需每次都加载所有控制器类。
    • 由于预编译的树结构,匹配算法的复杂度为O(log n)而不是O(n)。
  • 几乎无需正则表达式匹配。
  • 反向路由。
  • 完全可配置的数据反序列化。

生命周期

一次性编译

  • 根据路由查找所有控制器及其方法。
  • 执行RouteAnnotations以解析额外的路由属性。
  • 构建和缓存路由树。
  • 构建和缓存反向路由的数据。

运行时阶段1(假设)

  • 创建PSR-7 ServerRequest对象。

运行时阶段2

  • 解析PSR-7 ServerRequest的控制器、方法和属性。
  • 通过附加运行控制器所需的自定义属性和数据来修改请求。

运行时阶段3(假设)

  • 运行其他中间件,可以根据PSR-7 ServerRequest属性启用/禁用。例如:可以为特定路由禁用授权或CSFR。

运行时阶段4

  • 读取PSR-7 ServerRequest中的属性。
  • 使用阶段2中解析的方法运行控制器。
  • 如果控制器以简化的形式返回数据,将其包装成最终响应。

为什么有两个路由中间件?

主要原因是为了使用注解(PHP属性)通过请求属性配置其他中间件。例如,这允许在控制器之间设置AuthMiddleware,这样它可以在控制器处理之前拒绝请求。

RouteAnnotations

RouteAnnotations是一种语法糖。可以通过Route $attributes参数达到相同的效果。因为路由属性是在路由树缓存之前解析的,所以它不应该动态。

特殊处理方法参数

可以将请求或解析后的体直接传递给路由处理器

  • 如果处理方法参数的类型为ServerRequestInterface,它将被解析为原始请求。
  • 如果处理方法参数的类型为ResponseInterface,它将被解析为新请求。因此无需调用ResponseFactoryInterface
  • 如果参数由Body属性注解,它将通过请求的body属性解析。如果它的类型是array,它还可以解析为JSON。

反向路由器

可以通过路由名称和参数生成路由路径。