控制器中间件
一、前期准备
(一)定义路由
设置 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']]
];
only
,只有。这段代码意为 check
中间件只拦截 MyMiddleware
控制器的 save
和 read
方法。
与之对应的还有 except
关键字。except
,除了,即除了指定的方法,其他的方法都会拦截。
protected $middleware = [
'check' => ['only'=>['save','read']]
];
这段代码意为 check
中间件除了 save
、read
方法,其他方法都会拦截。
(四)测试
先注释 middleware
属性:
测试 save
方法,save
方法的路由:
POST mymiddle
测试 delete
方法,delete
方法的路由如下:
DELETE mymiddleware/:name