未重定向到 Codeigniter 4 中的特定 URL

use*_*641 5 php codeigniter codeigniter-4

为什么每当我通过 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我把它放在索引中,它就会按预期工作。

public function index()
{
        if(session('username')){
            return redirect()->to('/dashboard');
        }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我不想直接在索引内使用它,因为它需要同一文件的其他方法。

Pra*_*bhu 5

根据 Codeigniter 论坛,您不能再使用redirect构造函数中的方法重定向到任何控制器。

请参阅以下链接了解更多信息

https://forum.codeigniter.com/thread-74537.html

它明确指出redirect()将返回一个类实例而不是设置标头,并且在 PHP 中实例化不同的类时不能返回另一个类的实例。

这就是为什么你不能redirect在构造函数中使用方法。

相反,我可以建议您使用该header方法并重定向到您想要的控制器。

<?php namespace App\Controllers\Web\Auth;

class Register extends \App\Controllers\BaseController
{
    function __construct()
    {
        if(session('username')){
            header('Location: /dashboard');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这不可行或难以实现,您可以按照以下代码操作

<?php namespace App\Controllers\Web\Auth;

class Register extends \App\Controllers\BaseController
{
    function __construct()
    {
        //call to session exists method
        $this->is_session_available();
    }

    private function is_session_available(){
        if(session('username')){
            return redirect()->to('/dashboard');
        }else{
            return redirect()->to('/login');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个解决方案将比第一个解决方案更具交互性。并确保该方法是私有的。因此不应从其他类实例调用它。

社区团队还给出了一个解决方案来调查controller filter.

https://codeigniter4.github.io/CodeIgniter4/incoming/filters.html

请参阅线程。我希望它可以帮助您找到更好的解决方案。

  • 现在我知道为什么了,谢谢!我实际上使用过滤器来实现我想要的。因为我真的不知道为什么它不起作用,而实际上它在以前的版本(3.*)上工作 (2认同)