控制器中间件

一、后期筹备

(一)定义路由

设置 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

批改代码如下:

<?phpdeclare (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 的时候,就返回谬误的响应:

<?phpdeclare (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 属性:

<?phpdeclare (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 控制器的 saveread 办法。

与之对应的还有 except 关键字。except,除了,即除了指定的办法,其余的办法都会拦挡。

protected $middleware = [    'check' => ['only'=>['save','read']]];

这段代码意为 check 中间件除了 saveread 办法,其余办法都会拦挡。

(四)测试

先正文 middleware 属性:
测试 save 办法,save 办法的路由:

POST mymiddle

调用接口:

勾销 middleware 属性:
再次调用接口:

参考资料

  1. TP6 文档