2022/8/25 控制器中间件

控制器中间件
一、前期准备 (一)定义路由 设置 RESTFul 请求的资源路由

Route::resource('mymiddle','MyMiddleware')->vars(['mymiddle'=>'name]']);

注:resource 后面跟着的 vars方法是用于改变其中的变量名,默认的变量名是 id
read 的方法为例:
默认路由:
Route::get('mymiddle/:id','MyMiddleware/read');

修改变量名后的路由:
Route::get('mymiddle/:name','MyMiddleware/read');

(二)生成控制器 使用命令:
php think make:controller MyMiddleware

修改代码如下:
'hello','time'=>$time]); }public function save(Request $request) { $params = $request->param(); $name = $params['name']; return JsonResponseHandler::succ('name '.$name.'保存成功'); }public function read($name) { return JsonResponseHandler::succ('操作成功',['name'=>$name]); }public function edit($name) { return JsonResponseHandler::succ('将 name 为 '.$name.' 的数据找出来,并显示到页面'); } public function delete($name) { return JsonResponseHandler::succ('name '.$name.'已经被删除'); } }

二、中间件 (一)生成中间件类 使用命令生成中间件:
php think make:middleware Check

修改中间件类,增加一个判断的逻辑,如果当前请求的 name 参数等于 think 的时候,就返回错误的响应:
param('name') == 'think'){ return JsonResponseHandler::error('name 不能为 think'); } return $next($request); } }

(二)定义中间件别名 在应用 config 目录下的 middleware.php 中先预定义中间件(其实就是增加别名标识):
[ 'check' => app\middleware\Check::class, ], // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 'priority' => [], ];

(三)控制器中间件 在 MyMiddleware 控制器中定义 middleware 属性:
['only'=>['save','read']] ]; public function index() { $time = date('Y-m-d H:i:s',time()); return JsonResponseHandler::succ('操作成功',['greeting'=>'hello','time'=>$time]); }. . . }

MyMiddleware 控制器新增的代码:
protected $middleware = [ 'check' => ['only'=>['save','read']] ];

【2022/8/25 控制器中间件】only,只有。这段代码意为 check 中间件只拦截 MyMiddleware 控制器的 saveread 方法。
与之对应的还有 except 关键字。except,除了,即除了指定的方法,其他的方法都会拦截。
protected $middleware = [ 'check' => ['only'=>['save','read']] ];

这段代码意为 check 中间件除了 saveread 方法,其他方法都会拦截。
(四)测试 先注释 middleware 属性:
测试 save 方法,save 方法的路由:
POST mymiddle

调用接口:
2022/8/25 控制器中间件
文章图片

取消 middleware 属性:
再次调用接口:
2022/8/25 控制器中间件
文章图片

测试 delete 方法,delete 方法的路由如下:
DELETE mymiddleware/:name

调用 delete 接口,结果如下:
2022/8/25 控制器中间件
文章图片

参考资料
  1. TP6 文档

    推荐阅读