thinkphp6:middleware中间件的使用

中间件主要用于拦截或过滤应用的 HTTP 请求,并进行必要的业务处理。
首先在TP6里是默认没有开启Session,如果你的中间件业务逻辑里有使用到Session,比如用户登录等,必须手动在 app/middleware.php 文件中删除\think\middleware\SessionInit::class 的注释,最终效果为:

<?php
// 后台中间件定义
return [
    \think\middleware\SessionInit::class
];

定义中间件

可以通过命令行指令快速生成中间件

php think make:middleware Check

这个指令会在 app/middleware 目录下面生成一个Check中间件。

<?php

namespace app\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
        if ($request->param('name') == 'think') {
            return redirect('index/think');
        }

        return $next($request);
    }
}

中间件的入口执行方法必须是 handle 方法,而且第一个参数是 Request 对象,第二个参数是一个闭包。

中间件使用

当你定义一个中间件后,怎么让你的控制器执行之前自动加载中间件中的逻辑呢?
你需要在app/middleware.php目录中新增一行参数

//全局定义中间件
app\middleware\Check::class,//这个命名空间就是你创建的那个中间件

但是这样会让全局都加载你的中间件逻辑,但是貌似很多情况下你并不需要全部加载,例如你的中间件逻辑是登录状态的检测,如果未登录则跳转到登录页面,你必须要让你的登录注册页面不加载中间件,那么怎么做呢?
我们可以在需要使用中间件的控制器中加入以下代码单独加载中间件。

/**
 * 初始化中间件
 * @var \string[][][]
 */
 protected $middleware = [
     \app\middleware\Check::class    =>  [
         'except'    =>  ['login','reg']
     ]
 ];

这样你的控制器就单独加载了你的中间件逻辑,不干预其他控制器,并且你可以在 except 属性中定义不需要加载的方法名,比如我的登录页面为login,那我在except中添加一个login就可以完美让他访问的时候不处理中间件的逻辑了。

下面放一个我常用的中间件逻辑,可以参考一下

<?php
declare (strict_types = 1);

namespace app\admin\middleware;

class LoginCheck
{
    /**
     * @param $request
     * @param \Closure $next
     * @return mixed|\think\response\Redirect
     * @author ocink
     */
    public function handle($request, \Closure $next)
    {
        // 登录验证
        if (!$this->isLogin()) {
            return redirect(url('index/login'));
        }

        return $next($request);
    }

    protected function isLogin()
    {
        if(empty(session('SessionData'))){
            //执行未登录逻辑
            return false;
        }else{
            return true;
        }
    }

}

添加新评论

文章状态:已收录~