首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Codeigniter4如何从派生类构造函数调用父控制器的构造函数

Codeigniter4如何从派生类构造函数调用父控制器的构造函数
EN

Stack Overflow用户
提问于 2021-10-20 17:49:59
回答 2查看 1.1K关注 0票数 2

在Codeignter 4中,我们不能在BaseController中使用构造函数。但是initController()方法将执行此操作。但是如何从派生控制器的构造函数中调用此方法呢?

我的问题是,BaseController::is_allowed()方法将执行对所有派生控制器类通常有用的所有基本特性。但是要运行BaseController::is_allowed(),应该在此之前执行BaseController::__construct()。但是与CI-4一样,构造函数在BaseController中是不允许的.它可以有BaseController::initController()。但是问题是这个方法只在DerivedClass::__construct()之后才会执行。

在执行每个派生类方法之前,我需要执行BaseController::is_allowed()。因此,我在派生控制器的构造函数中调用BaseController::is_allowed()方法。但是派生类构造函数在执行BaseController::initController()之前执行。所以BaseController::is_allowed()不能工作。

BaseController.php

代码语言:javascript
运行
复制
<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\CLIRequest;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;


class BaseController extends Controller
{
    public $request;

    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        parent::initController($request, $response, $logger);
        
        // Doing all basic setups here that are needed to all other methods in this class.

        // This method will be called only after derivedClass::__construct().
        // But CI-4 not allows to use __construct() method in BaseController class.
        // This causes my problem.
    }

    function is_allowed()
    {
        // Provides all basic features for all derived controller classes.
        // But to work code in this method, initController() method should execute first.
    }
}

派生类为

Users.php

代码语言:javascript
运行
复制
<?php

namespace App\Controllers;

class Users extends BaseController
{
    public function __construct()
    {
        // BaseController::is_allowed() will provide all basic features for this controller.
        // To work this method, BaseController::initController() should execute.
        // But this will execute only after this ( __construct()) constuctor.
        // In Codeignier-3, BaseController::__construct() was possible.
        // It will execute before derived class constructor.
        $this->is_allowed();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-21 11:33:09

基本上,您的用户控制器应该使用iniController而不是构造,如下所示:

代码语言:javascript
运行
复制
<?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)
    {
        parent::initController($request, $response, $logger);
        $this->is_allowed();
    }
}

但是,将is_allowed函数作为受保护的函数在BaseController中创建是一个很好的做法,否则您可能可以通过site.com/users/is_ like等任何url访问它。

我甚至可以补充一点,如果is_allowed函数的目的是检查用户是否拥有执行操作的权限,甚至是在控制器中,那么您应该查看过滤器,而不是下面这个

票数 2
EN

Stack Overflow用户

发布于 2021-10-20 18:39:39

在Codeignter 4中,我们不能在控制器中使用构造函数。

在BaseController类中不使用典型的构造函数,仍然可以在App/Controller类中使用构造函数。

您不需要手动调用initController,这是在引导过程中为您完成的。从App\Controllers\Users构造函数中删除该行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69650835

复制
相关文章

相似问题

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