一元网络论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8730|回复: 0

thinkphp 中间件的作用的意义

[复制链接]

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
93367
发表于 2021-1-10 18:10:22 | 显示全部楼层 |阅读模式
减少了系统的一些if/else判断,因此降低了系统的耦合
这好象是关键吧,实际就是把一些判断解耦到了中间件里去做。




thinkphp中间件是什么?有什么作用?


中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。---tp5.1手册

也就是说,降低了系统的耦合;【在http请求阶段,执行中间件的入口执行方法(handle)--tp5.1】----减少了系统的一些if/else判断,因此降低了系统的耦合
中间件可以实现什么功能,例如权限验证,访问记录,重定向等等。-----这些业务的存在降低了耦合.




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


遇到的场景

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


简单粗暴的方法

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


使用中间件

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


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

    <?phpnamespace 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';

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




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|一元网络论坛

GMT+8, 2024-11-21 17:53 , Processed in 0.088712 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表