记一次控制器中间件的使用

遇到的场景

在一个商城网站中,对一个商品进行修改的操作有:编辑、上下架、审核、设置是否热门、设置是否促销等。现在有个需求是:不允许修改状态是已经失效的商品。

简单粗暴的方法

一个最直接的方法是,在每个可能的操作前面添加相应的判断,如果发现商品失效,就返回一个提示。这样,你就必须修改每个可能的方法。

使用中间件

使用中间件来实现该需求是最好不过了,你不必修改其中的任何一个方法,只需要创建一个控制器中间件,添加业务逻辑,配置哪些操作需要中间件过滤,一切搞定。

实施步骤

  1. 创建一个中间件
    在项目跟目录下,命令行运行php think make:middleware Check,这将会在application目录下,创建http/middleware文件夹(如果没有的话),同时,生成一个中间件文件Check.php,其代码如下:

    <?php
    namespace app\http\middleware;
    
    class Check
    {
        public function handle($request, \Closure $next, $name)
        {
            return $next($request);
        }
    }

    接着,在中间件的handle方法添加具体的业务逻辑,大概是这样子的:

    public function handle($request, \Closure $next, $name)
    {
        if ($id = $request->param('id')) {
            $result = \think\Db::name('goods')->where([['id', '=', $id], ['status', '=', 0]])->find();
            if ($result) {
                // 发现商品已经失效,返回一个提示数据,或者进行重定向等操作
               // 比如:
              // return \think\Response::create(['status' => 0, 'msg' => '该商品不能编辑哦'],'json');
          }
    }
        return $next($request);
    }
  2. 配置控制器中间件
    在需要用到该中间件的控制器所在的文件夹下,创建一个 middleware.php 文件,写入如下代码:

    return [
       app\http\middleware\Check::class
    ];
  3. 在需要中间件的控制器添加middleware属性,代码示例如下:

    protected $middlewate = ['Check' => ['only' => ['actionA', 'actionB', 'actionC']]];

    这样一个控制器中间件就完成了。以后如果有某些方法需要加进去验证,或者从验证中去掉,只需要修改该属性就可以了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Was mich nicht umbringt, macht mich stärker
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!