首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未重定向到Codeigniter 4中的特定URL

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

Stack Overflow用户
提问于 2020-03-01 15:17:18
回答 5查看 6.3K关注 0票数 4

为什么每当我通过我的Codeigniter 4控制器的构造函数重定向某个东西时,它就不能工作了?

代码语言:javascript
运行
复制
<?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');
    }
}

但是如果我把它放在索引中,它就会像预期的那样工作。

代码语言:javascript
运行
复制
public function index()
{
        if(session('username')){
            return redirect()->to('/dashboard');
        }
}

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-03-01 17:07:35

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

有关更多信息,请参考下面的链接

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

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

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

相反,我可以建议您使用header方法并将其重定向到所需的控制器。

代码语言:javascript
运行
复制
<?php namespace App\Controllers\Web\Auth;

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

如果这不可行或难以实现,您可以遵循以下代码

代码语言:javascript
运行
复制
<?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

请参考线。我希望它能帮助你找到一个更好的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2020-09-23 08:16:43

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

所以你有你的控制器登记册了。

您应该在应用程序/过滤器文件夹中创建一个过滤器,类似于checkLogin.php。

该过滤器应该具有以下结构:

代码语言:javascript
运行
复制
<?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中,应该将过滤器添加到所需的控制器中。

代码语言:javascript
运行
复制
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']],
];

有关过滤器和如何使用的更多信息,请查看文档。

指南/传入/filters.html?高亮=过滤器

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-20 17:19:14

代码点火器4使用initController()创建构造函数。

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

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

代码语言:javascript
运行
复制
<?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');
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60476570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档