记一次控制器中间件的使用
遇到的场景
在一个商城网站中,对一个商品进行修改的操作有:编辑、上下架、审核、设置是否热门、设置是否促销等。现在有个需求是:不允许修改状态是已经失效的商品。
简单粗暴的方法
一个最直接的方法是,在每个可能的操作前面添加相应的判断,如果发现商品失效,就返回一个提示。这样,你就必须修改每个可能的方法。
使用中间件
使用中间件来实现该需求是最好不过了,你不必修改其中的任何一个方法,只需要创建一个控制器中间件,添加业务逻辑,配置哪些操作需要中间件过滤,一切搞定。
实施步骤
- 创建一个中间件
在项目跟目录下,命令行运行
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);
}
- 配置控制器中间件
在需要用到该中间件的控制器所在的文件夹下,创建一个
middleware.php
文件,写入如下代码:
return [
app\http\middleware\Check::class
];
- 在需要中间件的控制器添加
middleware
属性,代码示例如下:
protected $middlewate = ['Check' => ['only' => ['actionA', 'actionB', 'actionC']]];
这样一个控制器中间件就完成了。以后如果有某些方法需要加进去验证,或者从验证中去掉,只需要修改该属性就可以了。