ThinkPHP6使用中间价解决登录后redirect重定向无效的问题

作者: 温新

分类: 【ThinkPHP】

阅读: 5133

时间: 2020-04-20 17:35:09

步骤一:app/admin目录新建middleware.php中间价文件,其内容如下

app/admin/middleware.php

<?php
// 作用于admin目录的中间件配置文件

return [

];

步骤二:app/admin目录下新建middleware文件夹,并在此文件夹下新建登录控制中间价LoginMiddleware.php并编写代码

app/admin/middleware/LoginMiddleware.php

<?php
declare(strict_types = 1);

namespace app\admin\middleware;

use think\facade\Session;

/**
 * Class LoginMiddleware 登录控制中间件
 * @package app\admin\middleware
 */
class LoginMiddleware
{
    public function handle($request, \Closure $next)
    {

        // 前置中间价
        $adminData = Session::get('adminData');
        if(empty($adminData) && !preg_match('/login/i',$request->pathinfo())){
            return redirect(url('admin/login/index'));
        }

        return $next($request);
    }

    public function end(\think\Response $response)
    {
        // 回调行为
    }
}

步骤三:app/admin/middlerware.php文件中注册中间价,使之生效

<?php
// 作用于admin目录的中间件配置文件
return [
    // 注册
    app\admin\middleware\LoginMiddleware::class
];

步骤四:Base控制器中初始化方法

<?php

namespace app\admin\controller;

use app\BaseController;
use think\App;
use think\exception\HttpResponseException;
use think\facade\Session;

/**
 * Class Base 公共控制器
 * @package app\admin\controller
 */
class Base  extends  BaseController
{

    // 初始化控制器
    public function initialize()
    {
        parent::initialize();
    }

    /**
     * 判断用户是否登录
     * @return bool
     */
    public function isLogin()
    {
        $adminData = Session::get('adminData');
        // 用户未登录返回 false
        if(empty($adminData)){
            return false;
        }

        // 用户已登录返回 true
        return true;
    }

    /**
     * 自定义重定向方法
     * @param $args
     */
    public function redirectTo(...$args)
    {
        // 此处 throw new HttpResponseException 这个异常一定要写
        throw new HttpResponseException(redirect(...$args));
    }
}

步骤五:Login.php重定向

<?php

namespace app\admin\controller;

use think\facade\Db;
use think\facade\Session;
use think\facade\View;
use think\Request;

/**
 * Class Login 后台登录
 * @package app\admin\controller
 */
class Login extends Base
{
    public function initialize() {
        // 用户若已经登录,则重定向到首页
        if($this->isLogin()) {
            return $this->redirectTo(url('index/index'));
        }
    }
}

至此,使用中间来判断总户是否登录完成。

总结:

1)对比使用Base来看,中间件的步骤四、步骤五这两步都不省略,由此来看,使用中间件来判断用户是否登录并没有减少代码量,反而对于不熟悉中间件的开发人员来说,可能会感到陌生。两种方式如何取舍,就在于自己的选择。

2)这是一个坑,登录时,使用preg_match匹配时一定要注意。步骤二中 !preg_match('/login/i',$request->pathinfo())这一个片段代码因为没有加i而一直无法登录成功,登录就重定向,这个坑坑了我十多分钟,因此使用此方式时一定要带上i,i表示不区分大小写。

3)当习惯了使用Laravel框架时,与此同时又在使用Thinkphp框架,那么下意识就会把两个框架进行对比。当对比后就会发现,ThinkPHP与Laravel根本就没有可比性,Laravel实在是太优雅、太强大了。而ThinkPHP6也是在借鉴学习Laravel。

4)好了,已是深夜了,就记录到这吧。晚安,世界!

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年04月21日

请登录后再评论