为什么每当我通过我的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');
        }
}问题是,我不想直接在索引中使用它,因为它需要在同一个文件的其他方法上使用。
发布于 2020-03-01 17:07:35
根据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
请参考线。我希望它能帮助你找到一个更好的解决方案。
发布于 2020-09-23 08:16:43
在这种情况下,您甚至不应该在控制器中执行这种逻辑。这应该在过滤器中完成,而不是在控制器中完成。
所以你有你的控制器登记册了。
您应该在应用程序/过滤器文件夹中创建一个过滤器,类似于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']],
];有关过滤器和如何使用的更多信息,请查看文档。
然后,您甚至可以为其他控制器创建过滤器,以便在用户未登录时重定向到此控制器。
发布于 2021-01-20 17:19:14
代码点火器4使用initController()创建构造函数。
不能在__construct()或initController()函数中使用 redirect()。
但是,在调用控制器中的另一个函数之前,可以使用$response参数或$this->response调用initController()中的重定向;
<?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');
    }
}https://stackoverflow.com/questions/60476570
复制相似问题