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

CodeIgniter 4自定义目录下的文件如何调用模型或类

CodeIgniter4 自定义非控制器文件调用模型解决方案

报错根本原因

你直接执行自定义的原生PHP文件时,未加载CodeIgniter4的自动加载器,也没有初始化框架实例,因此无法识别App\Models下的命名空间类,报类未找到错误。


推荐方案:使用CI4官方Spark自定义命令(完全符合cron任务需求)

CI4自带的CLI命令机制天生适配定时任务场景,仅支持命令行触发,完全无法通过web路径访问,不需要你额外做防恶意访问的处理,是官方推荐的定时任务实现方式,配置步骤如下:

  1. 在app/Commands目录下新建命令类文件ExportAlert.php,示例代码如下:
<?php
namespace App\Commands;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;

class ExportAlert extends BaseCommand
{
    // 命令名称,执行时用php spark 后面加这个名称
    protected $name = 'export:alert';
    // 命令描述
    protected $description = '定时导出告警数据任务';
    // 命令用法说明
    protected $usage = 'export:alert';

    public function run(array $params)
    {
        date_default_timezone_set("Asia/Jakarta");
        $current_time = date("h:i a");
        $begin = "9:00 am";
        $end   = "3:30 pm";

        $now = \DateTime::createFromFormat('H:i a', $current_time);
        $timebegin = \DateTime::createFromFormat('H:i a', $begin);
        $timeend = \DateTime::createFromFormat('H:i a', $end);

        if (!($now > $timebegin && $now < $timeend)) {
            return false;
        } 

        // 直接调用模型,框架已自动加载,不会报类找不到错误
        $Utility = new \App\Models\Dennis_utility_model();
        $Setting = new \App\Models\Dennis_setting_model();
        $Medoo = new \App\Models\Dennis_medoo_model();
        $Telegram = new \App\Models\Dennis_telegram_model();

        $ExeFile = AmiBroker_Folder.JScript_Main_Folder.Export_Alert;
        $Url = $Setting->FPathSetting()['CROSSSERVER']['CURLEXE'];
        $Utility->CurlExe($Url, 1, 1, $Setting->FUseEngine64(), $ExeFile);

        $myconfig = new \Config\MyConfig();
        include 'include/Alert_1.php';
        CLI::write('任务执行完成', 'green');
    }
}
  1. 命令注册:CI4默认会自动扫描app/Commands目录下的命令类,无需手动注册,你可以直接在项目根目录执行php spark list查看是否出现export:alert命令验证。
  2. 配置cron任务:直接将定时任务的执行命令设置为cd 你的项目根目录 && php spark export:alert即可。

兼容方案:保留你现有自定义目录结构的修改方式

如果你坚持使用当前app/CronJob/ExportAlert.php的文件结构,只需要在文件最开头加入框架引导加载代码,初始化CI4实例即可:

<?php
// 路径根据你实际的项目结构调整,以下路径基于文件位于app/CronJob/ExportAlert.php的情况
require __DIR__ . '/../../vendor/autoload.php';
$paths = new \Config\Paths();
require $paths->systemDirectory . '/bootstrap.php';
// 初始化CI4实例,加载所有框架服务
$app = \Config\Services::codeigniter();
$app->initialize();

// 后面接你原来的业务代码即可
date_default_timezone_set("Asia/Jakarta");
$current_time = date("h:i a");
$begin = "9:00 am";
$end   = "3:30 pm";
// ... 其余原有代码不变

注意事项:

  • 确认你的所有模型文件都位于app/Models目录下,命名空间为namespace App\Models;,文件名和类名完全一致(CI4遵循PSR4自动加载,大小写敏感)
  • 为避免web访问风险,可在CronJob目录下添加.htaccess文件,内容为deny from all,或者直接将CronJob目录移出web可访问的根目录范围。

内容的提问来源于stack exchange,提问作者Dennis Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:15:02