You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeigniter4 Grocery Crud自定义模型如何获取CI4上下文?

在CodeIgniter4中为Grocery CRUD自定义模型获取框架上下文

问题背景

要实现Grocery CRUD的自定义模型,但CodeIgniter4(CI4)已移除了CodeIgniter3(CI3)中的get_instance()全局函数,原CI3的自定义模型代码依赖该函数获取框架实例与数据库连接,无法直接在CI4中使用。

原CI3参考代码:

<?php
//CustomersModel.php

use GroceryCrud\Core\Model;
use GroceryCrud\Core\Model\ModelFieldType;

class CustomersModel extends Model {

    protected $ci;
    protected $db;

    function __construct($databaseConfig) {
        $this->setDatabaseConnection($databaseConfig);

        $this->ci = & get_instance();
        $this->db = $this->ci->db;
    }

    public function getFieldTypes($tableName)
    {
     ...
}

解决方法

CI4采用服务容器与依赖注入的设计模式,无需通过get_instance()获取框架实例,可直接通过Services类获取所需服务:

修改后的自定义模型代码

<?php
//CustomersModel.php

use GroceryCrud\Core\Model;
use GroceryCrud\Core\Model\ModelFieldType;
use Config\Services;

class CustomersModel extends Model {

    protected $db;

    public function __construct($databaseConfig) {
        parent::__construct($databaseConfig);
        
        // 获取CI4数据库连接实例
        $this->db = Services::db();
    }

    public function getFieldTypes($tableName)
    {
        // 此处编写字段类型获取逻辑
    }

    // 其他自定义方法实现...
}

补充说明

  • 如果需要获取完整的CI4应用上下文实例,可使用:
    $app = \CodeIgniter\CodeIgniter::getInstance();
    
  • CI4的Services类可按需获取各类核心服务(如请求、响应、缓存等),推荐优先使用这种方式而非全局实例,更符合依赖注入的设计原则。

Grocery CRUD自定义模型文档(中文翻译)

什么是自定义模型?

自定义模型允许你完全控制Grocery CRUD的数据交互逻辑,替代默认的模型实现。当你需要处理复杂的业务规则、多表关联、自定义查询或非标准数据源时,自定义模型会非常有用。

自定义模型的核心要求

自定义模型必须继承GroceryCrud\Core\Model类,并实现以下核心方法:

  • getFieldTypes($tableName):返回指定表的字段类型信息,Grocery CRUD依赖此信息渲染表单与表格。
  • getList($tableName, $whereClause = [], $offset = 0, $limit = 20, $sorting = [], $searchText = ''):获取列表数据,支持分页、排序与搜索。
  • getOne($tableName, $primaryKeyValue):根据主键值获取单条记录。
  • insert($tableName, $data):插入新记录。
  • update($tableName, $primaryKeyValue, $data):更新指定记录。
  • delete($tableName, $primaryKeyValue):删除指定记录。
  • count($tableName, $whereClause = [], $searchText = ''):返回符合条件的记录总数,用于分页计算。

使用自定义模型

在控制器中初始化Grocery CRUD时,通过setModel()方法指定你的自定义模型:

$crud = new \GroceryCrud\GroceryCrud();
$crud->setModel(new \App\Models\CustomersModel($databaseConfig));
// 其他CRUD配置...
$output = $crud->render();

内容的提问来源于stack exchange,提问作者Rafael Mora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:17:16