在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
<?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
<?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();
}
}
发布于 2021-10-21 11:33:09
基本上,您的用户控制器应该使用iniController而不是构造,如下所示:
<?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函数的目的是检查用户是否拥有执行操作的权限,甚至是在控制器中,那么您应该查看过滤器,而不是下面这个
发布于 2021-10-20 18:39:39
在Codeignter 4中,我们不能在控制器中使用构造函数。
在BaseController类中不使用典型的构造函数,仍然可以在App/Controller类中使用构造函数。
您不需要手动调用initController
,这是在引导过程中为您完成的。从App\Controllers\Users
构造函数中删除该行。
https://stackoverflow.com/questions/69650835
复制相似问题