为什么每当我通过我的Codeigniter 4控制器的构造函数重定向某个东西时,它就不工作了?
<?php namespace App\Controllers\Web\Auth;
class Register extends \App\Controllers\BaseController
{
function __construct()
{
if(session('username')){
return redirect()->to('/dashboard');
}
}
public function index()
{
// return view('welcome_message');
}
}
但是如果我把它放在索引里面,它就能正常工作。
public function index()
{
if(session('username')){
return redirect()->to('/dashboard');
}
}
问题是,我不想直接在索引中使用它,因为我需要在同一个文件的其他方法上使用它。
5条答案
按热度按时间yk9xbfzb1#
根据Codeigniter论坛,您不能再使用构造函数中的
redirect
方法来重定向到任何控制器。有关详细信息,请参阅以下链接
https://forum.codeigniter.com/thread-74537.html
它清楚地表明
redirect()
将返回一个类示例而不是设置一个头,并且在PHP中示例化一个不同的类时不能返回另一个类的示例。这就是为什么你不能在构造函数中使用
redirect
方法。相反,我可以建议您使用
header
方法并重定向到所需的控制器。如果这不可行或者很难实现,您可以按照下面的代码
第二个解决方案比第一个更具有交互性。并且确保方法是私有的。这样它就不应该被其他类示例调用。
社区团队还提供了一个解决方案来研究
controller filter
。https://codeigniter4.github.io/CodeIgniter4/incoming/filters.html
请参考帖子,希望能帮助你找到更好的解决方案。
i2byvkas2#
在这种情况下,你甚至不应该在你的控制器中执行这种逻辑,这应该在过滤器中完成,而不是在你的控制器中。
这样你就有了你的控制器Register。
您应该在app/filters文件夹中创建一个类似checkLogin.php的过滤器
该筛选器应具有以下结构:
然后在你的app/config/Filters.php中,把filter添加到你想要的控制器中。
有关过滤器以及如何使用的详细信息,请查看文档。
https://codeigniter.com/user_guide/incoming/filters.html?highlight=filters
然后,您甚至可以为其他控制器创建过滤器,以便在用户未登录的情况下重定向到该控制器。
5w9g7ksd3#
Codeigniter 4使用
initController()
创建构造函数。不能在
__construct()
或initController()
函数中使用redirect()
。但是您可以使用
$response
参数或$this->response
在调用控制器中的另一个函数之前调用initController()
中的redirect;sqxo8psd4#
我刚进入CI 4,我遇到了和你一样的问题,因为我一直在接近CI 3的登录系统。
所以here是正确的方法,好好享受吧。
oipij1gg5#
Codeigniter 4在构造函数上没有任何返回值,但可以像这样使用
不要忘记使用exit()
但是,您最好使用Filters