路由验证
本小节主要介绍如何在路由验证请求的合法性,主要包括请求的变量规则、url后缀、路由中间件。
1.变量规则
这里以之前获取学生列表接口为例,若要在路由层面增加变量的过滤规则,可以使用pattern
方法,如下:
//获取学生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->pattern(['name' => '[\w|\-]+']);
如下图所示:
Tips: 其中
:name
表示路由后面可以跟变量name
,[\w|\-]+
是一个正则表达式,对name
字段匹配。
下面在 getStudents
方法中打印 name
变量,并返回正确的请求结果:
/**
* 获取学生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
halt($this->request->param('name'));
//每页条数
$size = (int)$this->request->param('size', 15);
$students = StudentModel::where('status', 1)->order('created_at DESC')->paginate($size);
return json($students);
}
如下图所示:
请求正确结果如下图:
请求不满足正则匹配的要求如下图:
2.URL 后缀验证
若想要某个请求的 url
的后缀满足某种后缀可以使用 ext()
方法,如下:
//获取学生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->ext('html');
如下图所示:
下面演示返回正确的情况:
下面演示返回错误的情况:
3.路由中间件
首先使用如下命令生成一个中间件 Auth
:
php think make:middleware Check
如下图所示:
然后Auth
中处理特定的请求,如下图贴出简单的权限验证的情况:
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
$token = $request->header('access-token');
if($token != '123456abc'){
throw new HttpException(401,"没有访问权限");
}
return $next($request);
}
如下图所示:
然后定义如下路由:
//获取学生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->ext('html')->middleware(\app\Middleware\Auth::class);
如下图所示:
如下图演示返回正确的请求:
如下图演示返回错误的请求:
4.小结
本小节介绍了常见的路由验证,其中变量规则验证一般用于验证 url
中表示请求参数的变量,url
后缀验证主要用于验证不满足指定后缀的 url
请求,如 .html
、txt
,路由中间件一般用于处理中间层的业务逻辑,如 权限验证
。
Tips: 代码仓库:https://gitee.com/love-for-poetry/tp6