遇到的场景

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

简单粗暴的方法

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

使用中间件

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

实施步骤

  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); }

  1. 配置控制器中间件 在需要用到该中间件的控制器所在的文件夹下,创建一个 middleware.php 文件,写入如下代码:
return [
	   app\http\middleware\Check::class
];
  1. 在需要中间件的控制器添加middleware属性,代码示例如下:
protected $middlewate = ['Check' => ['only' => ['actionA', 'actionB', 'actionC']]];

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