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

uhry853o  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(145)

为什么每当我通过我的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');
        }
}

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

yk9xbfzb

yk9xbfzb1#

根据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');
        }
    }
}

如果这不可行或者很难实现,您可以按照下面的代码

<?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');
        }
    }
}

第二个解决方案比第一个更具有交互性。并且确保方法是私有的。这样它就不应该被其他类示例调用。
社区团队还提供了一个解决方案来研究controller filter
https://codeigniter4.github.io/CodeIgniter4/incoming/filters.html
请参考帖子,希望能帮助你找到更好的解决方案。

i2byvkas

i2byvkas2#

在这种情况下,你甚至不应该在你的控制器中执行这种逻辑,这应该在过滤器中完成,而不是在你的控制器中。
这样你就有了你的控制器Register。
您应该在app/filters文件夹中创建一个类似checkLogin.php的过滤器
该筛选器应具有以下结构:

<?php

namespace App\Filters;

use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

class CheckLogin implements FilterInterface
{

    /**
     * Check loggedIn to redirect page
     */
    public function before(RequestInterface $request, $arguments = null)
    {
        $session = \Config\Services::session();
        if (session('username')) {
            return redirect()->to('/dashboard');
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // Do something here
    }
}

然后在你的app/config/Filters.php中,把filter添加到你想要的控制器中。

public $aliases = [
    'csrf' => \CodeIgniter\Filters\CSRF::class,
    'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,
    'honeypot' => \CodeIgniter\Filters\Honeypot::class,
    'checkLogin' => \App\Filters\CheckLogin::class,
];

// List filter aliases and any before/after uri patterns
public $filters = [
    'checkLogin' => ['before' => ['Register']],
];

有关过滤器以及如何使用的详细信息,请查看文档。
https://codeigniter.com/user_guide/incoming/filters.html?highlight=filters
然后,您甚至可以为其他控制器创建过滤器,以便在用户未登录的情况下重定向到该控制器。

5w9g7ksd

5w9g7ksd3#

Codeigniter 4使用initController()创建构造函数。

不能在__construct()initController()函数中使用redirect()

但是您可以使用$response参数或$this->response在调用控制器中的另一个函数之前调用initController()中的redirect;

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

class Register extends \App\Controllers\BaseController
{
    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);
        
        
        if(session('username')){
            $response->redirect(base_url('dashboard')); // or use $this->response->redirect(base_url('dashboard'));
        }
    }
    
    public function index()
    {
        // return view('welcome_message');
    }
}
sqxo8psd

sqxo8psd4#

我刚进入CI 4,我遇到了和你一样的问题,因为我一直在接近CI 3的登录系统。
所以here是正确的方法,好好享受吧。

oipij1gg

oipij1gg5#

Codeigniter 4在构造函数上没有任何返回值,但可以像这样使用

public function __construct()
{
    if (!session()->has('user_id')) {
        header('location:/home');
        exit();
    }
}

不要忘记使用exit()

但是,您最好使用Filters

相关问题