open-core / router
符合PSR-15规范的快速路由中间件,基于预编译的搜索树
1.0.1
2023-04-15 11:19 UTC
Requires
- php: >=8.1
- psr/container: ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- psr/log: ^3.0
Requires (Dev)
- nyholm/psr7: ^1.5
- phpunit/phpunit: ^9.1
- relay/relay: ~2.0
Provides
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。
反向路由器
可以通过路由名称和参数生成路由路径。