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

Posted

技术标签:

【中文标题】未重定向到 Codeigniter 4 中的特定 URL【英文标题】:Not redirected to specific URL in Codeigniter 4 【发布时间】:2020-06-14 00:35:15 【问题描述】:

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

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

public function index()

        if(session('username'))
            return redirect()->to('/dashboard');
        

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

【问题讨论】:

您能否详细说明_我不想直接在索引中使用它,因为我需要使用同一文件的其他方法_?另外,当控制器被实例化时,你确定session() 吗? 如果我没记错的话,他的意思是他想在构造函数中检查会话,而不是在其他所有方法中编写它。可能是为了代码的可重用性和安全性.. 这是正确的@beingprabhu。我就是这个意思。 实现你想要做的事情的正确方法是使用过滤器而不是使用控制器中的构造。 【参考方案1】:

根据 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

请参考主题。我希望它可以帮助您找到更好的解决方案。

【讨论】:

现在我知道为什么了,谢谢!我实际上使用过滤器来实现我想要的。因为我真的不知道为什么它实际上在以前的版本(3.*)上工作时它不起作用 很高兴我的回答对您有所帮助。 Codeigniter 4 是对 Codeigniter 3 的完全重写。CI 3 中可用的许多方法和功能在 CI 4 中不可用。 是的,我今天才开始。自 12 月以来一直在等待,所以我可以开始我的新项目并重写旧项目。我注意到我的应用程序(我目前正在重写)与旧应用程序相比要快得多。虽然仍然有学习曲线,但不如 Laravel。我会被 Laravel 炸飞,这就是我等待 Codeigniter 4 的原因。 坦率地说,我还没有开始在 CI 4 中工作。我已经关注它几个月了,不幸的是没有太多时间研究它。谢谢你,因为你的问题启发了我,它让我对它进行了快速研究。这就是为什么我给你一个赞成票。 实现 OP 的正确方法是使用过滤器,而不是使用控制器中的构造。【参考方案2】:

在这种情况下,您甚至不应该在控制器中执行这种逻辑。这应该在过滤器中完成,而不是在您的控制器中完成。

所以你有你的控制器注册。

您应该在您的 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 中,您应该将过滤器添加到所需的控制器。

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

然后,您甚至可以为其他控制器创建过滤器,以便在用户未登录时重定向到该控制器。

【讨论】:

【参考方案3】:

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

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

但你可以使用$response参数或$this-&gt;responseinitController()调用重定向,然后再调用控制器中的另一个函数;

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

【讨论】:

【参考方案4】:

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

public function __construct()

    if (!session()->has('user_id')) 
        header('location:/home');
        exit();
    

别忘了使用 exit()

但是,你最好使用Filters

【讨论】:

实现 OP 的正确方法是使用过滤器,而不是使用控制器中的构造。 是的,我知道,但我只是回答他通过构造函数提出的 TS 问题

以上是关于未重定向到 Codeigniter 4 中的特定 URL的主要内容,如果未能解决你的问题,请参考以下文章

页面未重定向到给定链接 Mandrill

Nativescript后退按钮未重定向到正确的页面

IIS7.5下的Asp Net Mvc 4应用程序未重定向到登录页面[重复]

flask_login 中的 login_required 装饰器未重定向到上一页

验证后挂钩未重定向到表单页面

成功登录后登录页面未重定向到主页