路由验证

本小节主要介绍如何在路由验证请求的合法性,主要包括请求的变量规则、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请求,如 .htmltxt,路由中间件一般用于处理中间层的业务逻辑,如 权限验证

Tips: 代码仓库:https://gitee.com/love-for-poetry/tp6