一、前期准备

(一)定义路由

设置 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 控制器的 saveread 方法。

与之对应的还有 except 关键字。except,除了,即除了指定的方法,其他的方法都会拦截。

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

这段代码意为 check 中间件除了 saveread 方法,其他方法都会拦截。

(四)测试
1. 测试 save 方法

先注释 middleware 属性
测试 save 方法,save 方法的路由:

POST mymiddle

调用接口:
middleware-save.png

由结果可知,在注释 middleware 属性之后 save 方法没有被拦截。

取消注释 middleware 属性
再次调用接口:
middleware-save-1.png

由结果可知,save 方法被拦截了。

2. 测试 delete 方法

测试 delete 方法,delete 方法的路由如下:

DELETE mymiddleware/:name

调用 delete 接口,结果如下:
middleware-delete.png

由结果可知,delete 方法没有被拦截。

参考资料

  1. TP6 文档

Moonshadow2333
28 声望0 粉丝

征途漫漫