CodeIgniter 4自定义目录下的文件如何调用模型或类
CodeIgniter4 自定义非控制器文件调用模型解决方案
报错根本原因
你直接执行自定义的原生PHP文件时,未加载CodeIgniter4的自动加载器,也没有初始化框架实例,因此无法识别App\Models下的命名空间类,报类未找到错误。
推荐方案:使用CI4官方Spark自定义命令(完全符合cron任务需求)
CI4自带的CLI命令机制天生适配定时任务场景,仅支持命令行触发,完全无法通过web路径访问,不需要你额外做防恶意访问的处理,是官方推荐的定时任务实现方式,配置步骤如下:
- 在
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'); } }
- 命令注册:CI4默认会自动扫描
app/Commands目录下的命令类,无需手动注册,你可以直接在项目根目录执行php spark list查看是否出现export:alert命令验证。 - 配置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
相关产品推荐
相关产品推荐

