首页 > 建站教程 > PHP框架 >  Thinkphp6 redirect在initialize中不起作用的解决办法正文

Thinkphp6 redirect在initialize中不起作用的解决办法

后台一般都需要登录,不登录浏览自动跳转到登录界面。所以首先就想到让后台所有需要登陆的界面都继承一个common类,然后再common类的initialize中判断是否登录,如果未登录,用redirect跳转到登录界面。理想很美好,显示很骨感。在initialize初始化函数中直接调用redirect根本不跳转。代码如下:

如下:
Common.php
<?php
namespace app\admin\controller;

use app\BaseController;
use app\admin\model\Admin;

class Common extends BaseController
{
    public function initialize()
    {
        if(!session('userId') && !session('username')){
            return redirect(url('login/index'));
        }
    }
}
需要登录界面继承Common:
<?php
namespace app\admin\controller;
use app\admin\BaseController;
use app\admin\controller\Common;

class Index extends Common
{
    public function index()
    {
        return view();
    }
}
为什么redirect方法在initialize初始化函数不起作用,可以查看 ThinkPHP6使用Base公共控制器redirect()不起作用的解决方法 http://www.5imoban.net/jiaocheng/thinkphp/2020/0715/3894.html。按照此文章,修改Common.php,即可解决:
<?php
namespace app\admin\controller;

use app\BaseController;
use app\admin\model\Admin;
use think\exception\HttpResponseException;

class Common extends BaseController
{
    public function initialize()
    {
        if(!session('userId') && !session('username')){
            return $this->redirectTo(url('login/index'));
        }
    }

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