CodeIgniter 4.1.1中调用$this->request->isAJAX()报未定义方法的问题
CodeIgniter 4.1.1 调用
$this->request->isAJAX()报未定义方法的解决方案 错误根因
CodeIgniter 4.1.1的控制器核心属性(包括$this->request)的注入时机,是在子类构造函数执行完毕、进入控制器路由分发阶段才完成的。
你自定义Ruang控制器的时候,重写了类的构造函数但没有先调用父类构造方法,框架根本没把Request类实例绑定到$this->request属性上,此时调用对象方法自然会抛出undefined method错误。
可落地的修复方式
- 优先使用CI4官方推荐的模型属性绑定方式,删除自定义构造函数,将模型初始化挪到类属性声明处,框架会自动调整注入时序完成实例化:
替换原有代码片段:// 替换原有的属性声明 protected $jenis = \App\Models\Mruang::class; // 彻底删除类中自定义的__construct()方法即可 - 如果必须保留自定义构造函数逻辑,一定要在构造函数第一行先调用父类构造,让框架先完成核心属性的绑定,再执行自定义初始化:
public function __construct() { // 第一行必须先执行父类构造,否则所有核心属性都是未初始化状态 parent::__construct(); // 再执行自己的初始化逻辑 $this->jenis = new Mruang(); } - 临时应急可以直接通过服务容器获取Request实例判断,不改动原有代码逻辑:
public function tampil() { $currentRequest = \Config\Services::request(); if ($currentRequest->isAJAX()) { // 原有业务逻辑保持不变 } }
通用排查提示:只要在CI4控制器中重写构造方法后出现核心属性方法未定义的报错,90%的概率是构造函数执行顺序错位,没有第一时间调用
parent::__construct()导致的。
内容的提问来源于stack exchange,提问作者BangBrow
相关产品推荐
相关产品推荐

