PHP-MVC中AJAX调用控制器时提示MvcModelT类未找到报错
AJAX调用MVC控制器提示模型类未找到问题排查
问题复现代码
AJAX视图层代码
$(document).ready(function(){ $('#u').change(function(){ $('#u option:selected').each(function(){ id_region = $('#u').val(); $.ajax({ method: 'POST', url: './Controllers/controllerTitles.php', data: {'data': id_region}, success: function(data,status){ alert(data + " " + status) } }); }); }); });
控制器层代码
<?php class controllerTitles{ public static function Academic($id_u){ $d = array("id_u" => $id_u); $of=MvcModelT::consultA($d); $html = "<option value='0'>SELECT ONE</option>"; foreach($ofs as $o){ $html .= "<option value='".$o["id_of"]."'>".$o["name"]."</option>"; } echo $html; } } if(isset($_POST['data'])){ $a = $_POST['data']; $menu1 = new controllerTitles(); $menu1 -> Academic($_POST['data']); } ?>
报错信息
Fatal error: Uncaught Error: Class "MvcModelT" not found in D:\xampp\htdocs\MVC_proyect\Controllers\controllerTitles.php:29
正常运行的传统调用方式(视图层)
<?php $menu = new controllerTitles(); $menu -> Academic(234); ?>
注:传统调用时控制器代码完全一致,无报错。
故障原因
- 传统调用走项目统一入口文件(通常是根目录
index.php),入口文件中已经提前注册了类自动加载规则、或提前引入了模型类等核心依赖,控制器调用MvcModelT时可以正常找到类定义。 - AJAX请求直接指向控制器文件
./Controllers/controllerTitles.php,完全绕过了项目入口,既没有加载自动加载规则,也没有引入MvcModelT类文件,自然触发类不存在的致命错误。 - 控制器代码还存在一处隐藏笔误:循环遍历的变量
$ofs未定义,应为上方赋值的$of,类加载问题修复后这里会触发变量未定义警告。
修复方案
方案一(推荐,符合MVC规范)
所有请求统一走项目入口,不要直接访问控制器文件,调整AJAX请求地址,通过路由参数指定要调用的控制器和方法:
$.ajax({ method: 'POST', // 按你项目实际的路由规则调整参数,示例为c传控制器名、a传方法名 url: './index.php?c=controllerTitles&a=Academic', data: {'data': id_region}, success: function(data,status){ alert(data + " " + status) } });
方案二(临时快速修复)
在控制器文件顶部手动引入模型类文件,同时修正变量笔误:
<?php // 按你项目实际的模型文件存储路径调整引入路径 require_once __DIR__ . '/../Models/MvcModelT.php'; class controllerTitles{ public static function Academic($id_u){ $d = array("id_u" => $id_u); $of=MvcModelT::consultA($d); $html = "<option value='0'>SELECT ONE</option>"; // 修正笔误:$ofs 改为 $of foreach($of as $o){ $html .= "<option value='".$o["id_of"]."'>".$o["name"]."</option>"; } echo $html; } } if(isset($_POST['data'])){ $menu1 = new controllerTitles(); $menu1 -> Academic($_POST['data']); } ?>
内容的提问来源于stack exchange,提问作者yhoyo
相关产品推荐
相关产品推荐

