无法从 CodeIgniter 4 中的子文件夹初始化父控制器



我在CI4项目中有以下结构:

app
pages
Front.php
Member.php
manage
Courses.php

路由规则如下:

$routes->group('pages', ['namespace' => 'AppPages'], function ($routes) {
$routes->resource('member', ['only' => ['index', 'show']]);
$routes->group('manage', ['namespace' => 'AppPagesManage'], function ($routes) {
$routes->resource('courses', ['only' => ['index', 'update']]);
});
});

Front.php是主控制器。

namespace AppPages;
use CodeIgniterHTTPRequestInterface;
use CodeIgniterHTTPResponseInterface;
use PsrLogLoggerInterface;
class Front extends CodeIgniterController
{
protected $me;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) {
parent::initController($request, $response, $logger);

$this->me = $this->run();
log_message('info', 'My id: ' . $this->me);

}
private function run() {
return 10;
}
protected function showVal($val) {
log_message('info', 'Value is: ' . $val);
}
}

Member.php扩展了Front.php.

namespace AppPages;
class Member extends Front
{
protected $model;
public function __construct()
{
log_message('info', 'My id in Member: ' . $this->me);
helper('utils');
$this->model = model('AppModelsMemberModel');
}
public function index() {}
public function show($mid) {}
}

访问URL website.com/pages/member会产生以下日志消息:

我的id: 10

My id in Member: 10

表示前控制器初始化正确。

然而,我未能从子文件夹控制器初始化前控制器。

namespace AppPagesManage;
use AppPagesFront;
class Courses extends Front
{
public function __construct()
{
log_message('info', 'My id in Courses: ' . ($this->me ?? 'Not available'));
}
public function index() {}

public function update($cid) {
$this->showVal(100);
}
}

访问website.com/pages/manage/courses会得到以下日志:

My id in Courses is: not available

但是,对课程执行PUT请求会得到日志:

My id in Courses is: not available

值为:100

所以Courses控制器可以包含Front控制器,但是不能初始化它

我错过了什么?

我应该让它以与成员控制器相同的方式初始化

我是否需要在课程类构造函数中通过调用parent::initController(…)手动初始化它?

谢谢你的帮助。

在php中__construct()不会自动调用parent::__construct()。initController()也不会被任何扩展类自动调用。

然而,从当前实例调用(几乎)任何函数都会调用initController()。你需要在Member.php的构造函数中实例化一个模型,它强制共享实例。

确保初始化的方法是在扩展构造函数中调用initController()。

最新更新