ci4控制器必须声明命名空间、继承codeignitercontroller、文件名与类名首字母大写且一致;需显式return响应,视图传值不再自动解包,路由须手动配置,模型更新须用where条件或model类方法。

CI4控制器怎么写才不会报错
直接继承 CodeIgniterController,别用 CI3 的 CI_Controller——这是新手最常踩的坑。CI4 已完全转向命名空间和现代 PHP 语法,类名、路径、继承关系全变了。
- 控制器必须放在
app/Controllers/目录下,文件名首字母大写(如Home.php),类名与文件名一致(class Home extends CodeIgniterController) - 方法默认不自动调用
parent::__construct();只有当你需要手动控制初始化顺序或覆盖默认行为时才显式调用 - 路由匹配到方法后,框架会自动注入请求、响应等服务;不要在方法里重复
$this->request或$this->response的实例化 - 返回响应必须显式:用
return $this->view('home')或return $this->response->setJSON(...),空 return 会导致空白页且无错误提示
视图传值为什么总显示 Notice: Undefined variable
因为 CI4 不再支持自动提取数组键为变量,$this->view('page', $data) 传入的数组不会自动解包成局部变量——这点和 CI3 完全不同。
- 正确做法是:在视图中用
$data['title']显式访问,或改用extract($data)手动导入(不推荐,易污染作用域) - 更安全的写法是在控制器里用
return view('page', ['title' => '首页', 'items' => $list]),然后视图里直接用= esc($title) ?> -
esc()是必须的:它默认对输出做 HTML 实体转义,防止 XSS;漏掉它,用户提交的<script></script>就可能执行 - 如果用了
view()辅助函数而非$this->view(),那它返回的是字符串,不能直接 echo,要echo view(...)或return view(...)
模型更新数据老是全表覆盖或失败
别在控制器里直接用 Query Builder 写 update() ——没加 where() 就调用,要么报错,要么静默更新整张表。
- CI4 模型(继承
CodeIgniterModel)才是更新操作的正确入口:定义protected $table = 'users'和主键protected $primaryKey = 'id'后,$model->update($id, $data)会自动拼 WHERE 条件 - 单条更新优先用
$model->update($id, $data);批量更新用$model->updateBatch($data, $idKey),别手写循环 + 单条 update - 如果字段含时间戳(
$createdField/$updatedField),确保模型启用了protected $useTimestamps = true,否则updated_at不会自动刷新 - 更新前检查
$model->find($id)是否存在,避免对空 ID 执行 update 导致意外插入(取决于数据库配置)
路由配置后页面 404 或跳转异常
CI4 默认关闭了 Apache 的 mod_rewrite 友好 URL 支持,index.php 不是可选的——除非你主动配好重写规则。
- 开发阶段先确认能否访问
http://localhost/index.php/home;能打开说明框架跑通,不能则先查 PHP 版本(CI4 要求 PHP 7.4+,且禁用短标签) - 自定义路由写在
app/Config/Routes.php的$routes->get('/news/(:segment)', 'News::view/$1')这类格式里,别漏掉$1占位符 - CLI 启动内置服务器(
php spark serve)时,路由自动生效且无需重写;但用 Apache/Nginx 部署时,必须配置.htaccess或 server block,否则所有非index.php开头的路径都会 404 -
$routes->setDefaultNamespace('AppControllers\')必须保留,否则控制器类找不到——反斜杠要双写,\,单个会被 PHP 当作转义
writable/logs/)和明确的返回语句来定位。











