🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 中间件注册方法有3种 <br/> ## 项目配置文件 ~~~ // 项目配置文件Conf.php中有一项 MIDDLEWARE 定义项目默认中间件 return [ // 项目默认中间件注册 'MIDDLEWARE' => [ // 前置,值为中间件的方法名 'BEFORE' => [ 'before', // 如果需要传递控制器类中定义的参数则 // 'before(...)' ], // 后置 'AFTER' => [ 'after' ] ], ]; ~~~ <br/> ## 路由中指定 ~~~ // 定义路由时第三个参数表示需要注册的中间件 // 分组路由因为涉及到多个方法,所以可以指定需要排除执行前置或者后置中间件的方法 Router::group([ 'admin\/(.*)' ], [ // 指定该路由使用的前置中间件 'BEFORE' => [ [ 'name' => 'before_1(...)', // 指定需要排除该中间件的控制器方法名 'exclude' => [] ], [ 'name' => 'before_2(...)', // 指定需要排除该中间件的控制器方法名 'exclude' => [] ] ], // 指定该路由使用的后置中间件 'AFTER' => [ [ 'name' => 'after_1', // 指定需要排除该中间件的控制器方法名 'exclude' => [] ] ] ]); ~~~ <br/> ## 装饰器 ~~~ // 可以直接在控制器方法的注释中添加装饰器来注册中间件 namespace spi; use spi\Init; class Demo extends Init{ public function __construct() { parent::__construct(); } /** * *************************************************************************** * aaa -- 演示 * * 说明 : * * * 请求 : * @method : post * * 前置 : * @before : before * * 后置 : * @after : after * * 历史 : * 2021/10/14 : created * *************************************************************************** */ public function aaa() { } } ~~~ <br/> ## 获取中间件中的返回值 ~~~ // 如果在前置中间件中 return 值的话,则可以在控制器方法中获取该值 // 例如,在Middleware.php中创建中间件test ...... /** * 创建一个中间件 * * $hash 字符串类型 本次访问的hash值,可用于做缓存的KEY * $args 参数列表,很多时候我们需要在中间件里使用控制器中定义的私有、公有变量 * 则需要在注册中间件的时候在名称后加“(...)” */ public function test($hash, $args = []) { // $args['_PARAM']用来获取装饰器中传递的参数 print_r($args['_PARAM']); // 一系列逻辑处理 $result = ['data' => '处理的结果,需要返回到具体控制器中']; return $result; } // =========================================== // // 在控制器中注册test前置中间件,控制器默认接收一个参数,就是前置中间件中返回的值 /** * *************************************************************************** * -- * * 说明 : * * * 前置 : * @before : before_1(...) * * 后置 : * * 历史 : * 2021-10-11 : created * *************************************************************************** */ public function aaa(array $result = []) { print_r($result); } ~~~ 运行上例的结果就是中间件中return的数组 ![](https://box.kancloud.cn/1d34f068d87bba447d9600527b60ed72_548x45.png) <br/> ## 后置中间件获取所有返回值 ~~~ // 后置中间件一般需要获取前置和控制器中的处理结果,加工后再返回json数据出去 // 在控制器中return需要返回的数据,则后置中间件中可以通过第三个参数来获取 /** * *************************************************************************** * -- * * 说明 : * * * 前置 : * @before before_1(...) * * 后置 : * @after after * * 历史 : * 2021-10-11 : created * *************************************************************************** */ public function index(array $result = []) { return ['id' => 1]; } // 在middleware中创建后置中间件 /** * 创建一个中间件,默认提供3个参数 * * $hash 字符串类型 本次访问的hash值,可用于做缓存的KEY * $args 参数列表,很多时候我们需要在中间件里使用控制器中定义的私有、公有变量 * 则需要在注册中间件的时候在名称后加“(...)” * $result 服务执行返回的结果,只有注册为后置中间件才有该参数 */ public function after($hash, $args = [], $result = []) { echo '后置中间件'; // 此处的$result就是控制器中返回的 ['id' => 1] print_r($result); // 可以在此处对返回的结果加工再处理后统一返回 json($result); } ~~~ ## 立刻结束 ~~~ // 在前置中间件中 return TRUE,则可以立刻结束本次调用,不会继续向下执行,可以用于一些权限验证 ~~~