CodeIgniter 4:在派生类控制器中调用父类控制器的初始化方法

codeigniter 4:在派生类控制器中调用父类控制器的初始化方法

本文档旨在解决CodeIgniter 4中,如何在派生类控制器的初始化过程中,正确调用并执行父类控制器的初始化方法。我们将探讨如何利用initController方法以及过滤器(Filters)来实现类似CodeIgniter 3中父类构造函数的功能,并确保在派生类方法执行前完成必要的父类初始化操作。

利用 initController 方法

在CodeIgniter 4中,由于不允许在BaseController中使用构造函数,推荐使用initController方法进行初始化。initController 方法会在派生类控制器的构造函数之后执行,这与CodeIgniter 3中父类构造函数的行为有所不同。

要解决在派生类方法执行前执行父类初始化的问题,最佳实践是在派生类的 initController 方法中调用父类的 initController 方法,并在调用后执行所需的操作,例如调用 is_allowed() 方法。

以下是一个示例:

<?php

namespace App/Controllers;

use CodeIgniter/HTTP/RequestInterface;
use CodeIgniter/HTTP/ResponseInterface;
use Psr/Log/LoggerInterface;

class Users extends BaseController
{
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        // 调用父类的 initController 方法
        parent::initController($request, $response, $logger);

        // 在这里执行需要在派生类方法执行前完成的操作
        $this->is_allowed();
    }

    public function index()
    {
        // 你的控制器逻辑
    }
}
登录后复制

注意事项:

  • 务必在派生类的 initController 方法中调用 parent::initController(),以确保父类的初始化逻辑得到执行。
  • is_allowed() 方法应该在 BaseController 中声明为 protected,以防止通过URL直接访问。

使用过滤器 (Filters) 进行权限验证

如果 is_allowed() 方法的目的是检查用户是否有权限执行特定操作或访问控制器,那么使用过滤器(Filters)是更推荐的做法。过滤器允许你在请求到达控制器之前或之后执行代码,这非常适合进行身份验证、授权等操作。

1. 创建一个过滤器类:

<?php

namespace App/Filters;

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

class AuthFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        // 在这里进行权限验证逻辑
        // 例如,检查用户是否已登录,或者是否有访问特定资源的权限
        if (!session()->get('isLoggedIn')) {
            // 如果没有权限,重定向到登录页面或显示错误信息
            return redirect()->to('/login');
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // 可选:在控制器执行后执行的逻辑
    }
}
登录后复制

2. 在 app/Config/Filters.php 中注册过滤器:

<?php

namespace Config;

use CodeIgniter/Config/BaseConfig;
use CodeIgniter/Filters/CSRF;
use CodeIgniter/Filters/DebugToolbar;
use CodeIgniter/Filters/Honeypot;
use CodeIgniter/Filters/InvalidChars;
use CodeIgniter/Filters/SecureHeaders;

class Filters extends BaseConfig
{
    public $aliases = [
        'csrf'          => CSRF::class,
        'toolbar'       => DebugToolbar::class,
        'honeypot'      => Honeypot::class,
        'invalidchars'  => InvalidChars::class,
        'secureheaders' => SecureHeaders::class,
        'auth'          => /App/Filters/AuthFilter::class, // 添加你的过滤器
    ];

    public $globals = [
        'before' => [
            //'honeypot',
            //'csrf',
            'auth' => ['except' => ['login', 'register']], // 应用于所有路由,除了 login 和 register
        ],
        'after'  => [
            'toolbar',
            //'honeypot',
            //'secureheaders',
        ],
    ];

    public $methods = [];
    public $filters = [];
}
登录后复制

3. 在控制器中使用过滤器:

你可以通过在 $globals[‘before’] 中配置全局过滤器,或者在控制器中单独配置过滤器。

例如,在 Users 控制器中使用 AuthFilter:

<?php

namespace App/Controllers;

use CodeIgniter/Controller;

class Users extends Controller
{
    public static function getFilters()
    {
        return [
            'before' => [
                'except' => [
                    'login', 'register', 'logout'
                ]
            ],
            'after'  => [
                'toolbar',
            ],
        ];
    }
    public function __construct()
    {
        // 确保调用父类的构造函数
        parent::__construct();
        $this->filters = self::getFilters();
    }
    public function index()
    {
        // 你的控制器逻辑
    }
}
登录后复制

总结:

在CodeIgniter 4中,推荐使用 initController 方法进行初始化,并在派生类的 initController 方法中调用父类的 initController 方法。对于权限验证等需要在控制器方法执行前进行的操作,使用过滤器(Filters)是更灵活和推荐的做法。过滤器提供了在请求生命周期中执行代码的能力,可以方便地进行身份验证、授权等操作。选择哪种方法取决于你的具体需求和项目的整体架构。

以上就是CodeIgniter 4:在派生类控制器中调用父类控制器的初始化方法的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1396445.html

发表回复

Your email address will not be published. Required fields are marked *