如何在 Codeigniter 4 Constructor 中加载会话

How do I load a session in Codeigniter 4 Constructor

就像在 Codeigniter 3 中一样,如果不在会话中,我可以通过在构造函数中设置以下代码来限制用户访问特定的控制器

if(! session()->get('username'))
    {
        return redirect()->to('/login');
    }

当我在 Codeigniter 4 中尝试相同的操作时,它不会工作,直到我在每个方法中加载它才能工作

您需要在调用 session()->get('yourvar') 之前初始化您的会话。
这应该有效:

$session = session();
$session()->get('username');

但是,正如您的 post 所说,如果您需要检查每个控制器是否需要会话,您绝对应该查看过滤器并创建一个自定义过滤器检查是否有会话。 https://codeigniter.com/user_guide/incoming/filters.html

app/Filters 中可能看起来像这样:

<?php

namespace App\Filters;

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

class LoginFilter implements FilterInterface {

    public function before(RequestInterface $request) {
        $session = session();
        if($session->has('username')) {
            return redirect()->to('/login'); 
        }
    }
    //--------------------------------------------------------------------

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

}

如果你想实现一个过滤器,不要忘记在Config/Filters.php

中声明它
// Makes reading things below nicer,
    // and simpler to change out script that's used.
    public $aliases = [
        'csrf'       => \CodeIgniter\Filters\CSRF::class,
        'toolbar'    => \CodeIgniter\Filters\DebugToolbar::class,
        'honeypot'   => \CodeIgniter\Filters\Honeypot::class,
        'login'      => \App\Filters\LoginFilter::class,
    ];

    // Always applied before every request
    public $globals = [
        'before' => [
            'login',
            //'honeypot'
        ],
        'after'  => [
            'toolbar',
            //'honeypot'
        ],
    ];