中间件
中间件主要用于编织从 请求(Request)
到 响应(Response)
的整个流程,通过对多个中间件的组织,使数据的流动按我们预定的方式进行,中间件的本质是一个 洋葱模型
,我们通过一个图来解释它:
图中的顺序为按照 Middleware 1 -> Middleware 2 -> Middleware 3
的顺序组织着,我们可以注意到当中间的横线穿过 内核
即 Middleware 3
后,又回到了 Middleware 2
,为一个嵌套模型,那么实际的顺序其实就是:Request -> Middleware 1 -> Middleware 2 -> Middleware 3 -> Middleware 2 -> Middleware 1 -> Response
重点放在 核心
即 Middleware 3
,它是洋葱的分界点,分界点前面的部分其实都是基于 进行处理,而经过了分界点时,内核
就产出了 响应(Response)
对象,也是 内核
的主要代码目标,在之后便是对 响应(Response)
进行处理了,内核
通常是由框架负责实现的,而其它的就由您来编排了。
全局中间件只可通过配置文件的方式来配置,配置文件位于 config/autoload/middlewares.php
,配置如下:
当我们有些中间件仅仅面向某些请求或控制器时,即可将其定义为局部中间件,可通过配置文件的方式定义或注解的方式。
在使用配置文件定义路由时,推荐通过配置文件来定义对应的中间件,局部中间件的配置将在路由配置上完成。Hyperf\HttpServer\Router\Router
类的每个定义路由的方法的最后一个参数 $options
都将接收一个数组,可通过传递键值 middleware
及一个数组值来定义该路由的中间件,我们通过几个路由定义来演示一下:
通过注解定义
在通过注解定义路由时,我们推荐通过注解的方式来定义中间件,对中间件的定义有两个注解,分别为:
- 注解为定义单个中间件时使用,在一个地方仅可定义一个该注解,不可重复定义
定义多个中间件:
定义方法级别的中间件
在通过配置文件的方式配置中间件时定义到方法级别上很简单,那么要通过注解的形式定义到方法级别呢?您只需将注解直接定义到方法上即可。方法级别上的中间件会优先于类级别的中间件,我们通过代码来举例一下:
中间件的执行顺序为 BarMiddleware -> FooMiddleware
。
我们从上面可以了解到总共有 3
种级别的中间件,分别为 全局中间件
、类级别中间件
、方法级别中间件
,如果都定义了这些中间件,执行顺序为:。