首页 > 解决方案 > 构造函数控制器中的重定向不起作用codeigniter4

问题描述

如何在 Codeigniter 4 的控制器中的构造函数内进行重定向?我制作了这段代码但不起作用

function __construct()
{
    if(!isset($_SESSION['a']))
    {
        
         return redirect('index.php/login');
    }
}

标签: phpcodeigniterconstructorcodeigniter-4

解决方案


这里有两件事,一是你不应该在 codeigniter 4 控制器中使用 __construct 魔术方法。相反,您应该使用 initController 方法,如下所示:

public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
{
    parent::initController($request, $response, $logger);
}

您应该研究的另一件事是过滤器。Codeigniter 4 中引入的一项新功能可以解决您刚才描述的确切问题。

您需要在控制器运行之前或之后检查某些内容。

以下是有关如何创建过滤器的示例:

<?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)
    {
        if(!isset($_SESSION['a'])) {
            return redirect()->to('/login');
        }
    }

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

然后你应该在你的 app/config/Filter.php 中配置它,你应该配置别名和你希望你的过滤器运行的控制器:

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

public $filters = [
    'checkLogin' => ['before' => ['dashboard']],
];

在这种情况下,我在仪表板控制器中使用它,但您可以随意制作。


推荐阅读