文章详情

无论是什么样的系统,大多数都会有用户登录功能,这是非常常见的功能,只要你是开发人员就会碰到。

作为最常见的功能,ThinkPHP6似乎更像出现了BUG一样。当使用Base公共控制器判断没有登录后,使用redirect()进行重定向,此时问题就来了。

redirect()不起作用!对于刚刚接触ThinkPHP6的开发人员来说,可能会认为这是ThinkPHP6的BUG。我个人赞同这样的认为!

事实上,这不是ThinkPHP6的BUG,此时你可能会发一个黑人问号的图片过来,但事实就是如此,这不是BUG。但是,作为框架,希望ThinkPHP官方人员能够改一改。

相比于Laravel框架,ThinkPHP6与之有着不小的差距。号称最优雅的PHP框架,Laravel已经为开发准备好了常用的功能,简单的户系统登录只需要执行一个简单的指令即可。

而ThinkPHP6确实弱了不少。

说了这么多的废话,下面开始代码解决问题吧!

【错误一】redirect()不起作用

public function index()
{
$test = session('user');
if(empty($test)){
// 此处黑人问号,今年然不起作用
$this->redirect('admin/Login/index');
}
}

【错误二】重写initialize方法后,出现重定向次数过多的问题

谷歌浏览器:该网页无法正常运作company.com 将您重定向的次数过多。

火狐浏览器:Firefox 检测到该服务器正在将指向此网址的请求无限循环重定向。

【解决方法】这两个问题同时解决,方法如下

下面的文件都在 app/admin/controller 下

Base.php // 继承BaseController的公共控制器

<?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();
// 用户未登录重定向到登录界面
if(empty($this->isLogin())){
// 正确重定向方法,一定写url()
return $this->redirectTo(url('login/index'));
// 错误重定向,没有写url()
// return $this->redirectTo('admin/Login/index');
}
}
/**
* 判断用户是否登录
* @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'));
}
}
}

这样就解决了登录重定向的问题了。 此处呢,只给出登录后再次访问登录页面后重定向到首页的方法

总结:这个问题不是BUG的原因是什么?原因是redirect()返回的是\think\response\Redirect对象,而此对象被app\BaseController类中的构造方法所获取。

vendor/topthink/framework/src/helper.php

if (!function_exists('redirect')) {
/**
* 获取\think\response\Redirect对象实例
* @param string $url  重定向地址
* @param int    $code 状态码
* @return \think\response\Redirect
*/
function redirect(string $url = '', int $code = 302): Redirect
{
return Response::create($url, 'redirect', $code);
}
}

app/BaseConatroller.php

/**
* 构造方法
* @access public
* @param  App  $app  应用对象
*/
public function __construct(App $app)
{
$this->app     = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}

本文主要介绍了ThinkPHP6使用Base公共控制器redirect()不起作用的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

您可能感兴趣的文章:

  • TP6使用redis操作报错Store [redis] not found.
  • tp6 给图片添加图标、文字水印

版权:版权申明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 70068002@qq.com 举报,一经查实,本站将立刻删除。

转载请注明出处:https://www.stntk.com/2633.html

相关推荐
php数据库怎样去重复的数据
当涉及到数据库去重功能时,PHP可以与数据库交互并执行相应的操作。以下是一个示例的PHP代码,用于从数据库中删除重复的记录并保留唯一的数据:…
头像
后端开发 2024-05-26
993
如何在 Python 中使用 try…else 块
在 Python 编程中,我们经常会遇到需要处理异常的情况。使用 try…except 块是一种常见的处理方法,它可以捕获和处理代码中可能出…
头像
后端开发 2024-05-26
1,297
php发送/显示 base64 编码图像
我需要向客户端发送一个 base64 编码的字符串。因此,我打开并读取服务器上的图像文件,对其进行编码并将该数据与 image/jpeg 内…
头像
后端开发 2024-05-26
11,508
php 生成条形码(支持任意php框架)
一:插件安装 在php中我们可以使用php-barcode-generator插件来生成条形码,php-barcode-generator插…
头像
后端开发 2024-05-26
954
如何在ThinkPHP6中使用队列技术
ThinkPHP 6(TP6)是一个流行的PHP框架,它提供了一些有用的工具和组件,其中之一就是队列(Queue)服务。队列是一种用于异步处…
头像
后端开发 2024-05-26
1,553
cURL error 60: SSL certificate problem: unable to get local issuer certificate 解决方法
fastadmin开发小程序登录功能报错: cURL error 60: SSL certificate problem: unable t…
头像
后端开发 2024-05-26
1,072
发表评论
暂无评论

还没有评论呢,快来抢沙发~

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

70068002@qq.com

扫描二维码

关注微信公众号