一、前期准备
(一)定义路由
设置 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
修改代码如下:
<?php
declare (strict_types = 1);
namespace app\controller;
use think\Request;
use app\handlers\JsonResponseHandler;
use think\response\Json;
class MyMiddleware
{
public function index()
{
$time = date('Y-m-d H:i:s',time());
return JsonResponseHandler::succ('操作成功',['greeting'=>'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
的时候,就返回错误的响应:
<?php
declare (strict_types = 1);
namespace app\middleware;
use app\handlers\JsonResponseHandler;
class Check
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
if($request->param('name') == 'think'){
return JsonResponseHandler::error('name 不能为 think');
}
return $next($request);
}
}
(二)定义中间件别名
在应用 config
目录下的 middleware.php
中先预定义中间件(其实就是增加别名标识):
<?php
// 中间件配置
return [
// 别名或分组
'alias' => [
'check' => app\middleware\Check::class,
],
// 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
'priority' => [],
];
(三)控制器中间件
在 MyMiddleware
控制器中定义 middleware
属性:
<?php
declare (strict_types = 1);
namespace app\controller;
use think\Request;
use app\handlers\JsonResponseHandler;
use think\response\Json;
class MyMiddleware
{
// 定义 middleware 属性
protected $middleware = [
'check' => ['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
方法,其他方法都会拦截。
(四)测试
1. 测试 save 方法
先注释 middleware
属性:
测试 save
方法,save
方法的路由:
POST mymiddle
调用接口:
由结果可知,在注释 middleware
属性之后 save
方法没有被拦截。
取消注释 middleware
属性:
再次调用接口:
由结果可知,save
方法被拦截了。
2. 测试 delete
方法
测试 delete
方法,delete
方法的路由如下:
DELETE mymiddleware/:name
调用 delete
接口,结果如下:
由结果可知,delete
方法没有被拦截。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。