从 3.x 升级到 4.x
CodeIgniter 4 是框架的重写,并且不向后兼容。将你的应用程序转换更合适,而不是升级它。一旦你完成了转换,从 CodeIgniter 4 的一个版本升级到下一个版本将很简单。
“精简、敏捷、简单”的理念仍然保留,但实现与 CodeIgniter 3 有很多不同。
升级没有 12 步检查表。相反,请在一个新的项目文件夹中使用 CodeIgniter 4 的副本开始, 选择 你希望的安装和使用方式, 然后转换和集成你的应用组件。 我们将尽量指出这里最重要的注意事项。
为了升级你的项目,我们总结出两项主要工作。首先,有一些对每个项目都很重要的一般调整,必须处理。其次是 CodeIgniter 构建的库,包含一些最重要的函数。这些库可以互相独立工作,所以你必须一一查看它们。
在启动项目转换之前,请阅读用户指南!
一般调整
下载
CI4 仍以 ready-to-run 压缩包或 tarball 形式提供。
它也可以使用 Composer 安装。
命名空间
CI4 是为 PHP 8.1+ 构建的,框架中的所有内容都使用了命名空间,除了 helper 和 lang 文件。
应用程序结构
重要
index.php 不再位于项目的根目录!为了更好的安全性和组件分离,它已被移到 public 文件夹内。
这意味着你需要配置你的 Web 服务器指向你项目的 public 文件夹,而不是项目根目录。
如果你使用共享主机,参见 部署到共享主机服务。
application 文件夹重命名为 app,框架仍然有 system 文件夹,与以前的解释相同。
框架现在提供了 public 文件夹,旨在作为你的应用程序的文档根目录。
defined('BASEPATH') OR exit('No direct script access allowed');
这一行不是必需的,因为在默认配置下, public 文件夹之外的文件不可访问。 并且 CI4 不再定义常量BASEPATH
,所以在所有文件中删除该行。还有一个 writable 文件夹,用于保存缓存数据、日志和 session 数据。
app 文件夹与 CI3 的 application 非常相似,只是一些名称更改,一些子文件夹移到了 writable 文件夹。
不再有嵌套的 application/core 文件夹,因为我们有一个不同的机制来扩展框架组件(见下文)。
路由
模型、视图和控制器
CodeIgniter 基于 MVC 概念。因此,模型、视图和控制器的更改是你必须处理的最重要的事项之一。
在 CodeIgniter 4 中,模型现在位于 app/Models 中,在打开的 php 标记之后,你必须添加
namespace App\Models;
以及use CodeIgniter\Model;
。最后一步是将extends CI_Model
替换为extends Model
。CodeIgniter 4 的视图已移至 app/Views。此外,你必须将加载视图的语法从
$this->load->view('directory_name/file_name')
更改为echo view('directory_name/file_name');
。CodeIgniter 4 的控制器必须移至 app/Controllers。之后,在打开的 php 标记后添加
namespace App\Controllers;
。最后,将extends CI_Controller
替换为extends BaseController
。有关更多信息,我们推荐你参考以下升级指南,这些指南将为你提供一些分步说明,以在 CodeIgniter4 中转换 MVC 类:
核心类更改
- Input
CI3 的 Input 对应于 CI4 的 IncomingRequest。
因为历史原因,CI3 和 CI4 使用了不正确的 HTTP 方法名称,比如 “get”, “post”。从 v4.5.0 开始,CI4 使用了正确的 HTTP 方法名称,比如 “GET”, “POST”。
类加载
库
你的应用类仍然可以放在 app/Libraries 中,但不必这样做。
不再使用 CI3 的
$this->load->library('x');
,现在可以使用$this->x = new \App\Libraries\X();
,遵循你组件的命名空间约定。或者,你可以使用 工厂:$this->x = \CodeIgniter\Config\Factories::libraries('X');
。
辅助函数
辅助函数 与以前基本相同,尽管有些进行了简化。
从 v4.3.0 开始,你可以通过 app/Config/Autoload.php 自动加载辅助函数,就像 CI3 一样。
CodeIgniter 3 中的一些辅助函数在版本 4 中不再存在。对于所有这些辅助函数,你必须找到一种新的方法来实现你的函数。这些辅助函数是 CAPTCHA Helper, Email Helper, Path Helper 和 Smiley Helper。
CI3 的 Download Helper 已移除。你需要在使用
force_download()
的地方使用 Response 对象。 请参阅 强制文件下载。CI3 的 Language Helper 已移除。但在 CI4 中
lang()
始终可用。请参阅lang()
。CI3 的 Typography Helper 在 CI4 中将是 排版库。
CI3 的 Directory Helper 和 File Helper 在 CI4 中将是 文件系统辅助函数。
CI3 的 String Helper 函数 在 CI4 的 文本辅助函数 中。
- 在 CI4 中,
redirect()
与 CI3 中的完全不同。 在 CI4 中,
redirect()
返回一个RedirectResponse
实例,而不是重定向并终止脚本执行。你必须从控制器或控制器过滤器中返回它。在调用
redirect()
之前设置的 Cookie 和 Header 不会自动携带到RedirectResponse
。如果你想发送它们,你需要手动调用withCookies()
或withHeaders()
。你需要将 CI3 的
redirect('login/form')
改为return redirect()->to('login/form')
。
- 在 CI4 中,
钩子
不再使用 CI3 的
$hook['post_controller_constructor']
,现在使用Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);
,命名空间为CodeIgniter\Events\Events;
。事件始终启用,并全局可用。
挂钩点
pre_controller
和post_controller
已被移除。使用 控制器过滤器 代替。挂钩点
display_override
和cache_override
已被移除。因为基础方法已被移除。挂钩点
post_system
已经移动到在发送最终渲染页面之前。
错误处理
CI4 中的行为已经稍有更改。
在 CI3 中,行为在 index.php 文件中设置:
错误级别由
error_reporting()
设置的错误将被记录(但根据log_threshold
设置,它们可能不会被写入日志文件)。错误级别为
E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR
的错误将停止框架处理,无论在error_reporting()
中设置的错误级别如何。
在 CI4 中,行为在 app/Config/Boot/{environment}.php 文件中设置:
错误级别由
error_reporting()
设置的错误将被记录(但根据Config\Logger::$threshold
设置,它们可能不会被写入日志文件)。所有不被
error_reporting()
忽略的错误都将停止框架处理。
扩展框架
你不需要 core 文件夹来保存
MY_...
框架组件扩展或替换文件。你不需要在 libraries 文件夹中使用
MY_X
类来扩展或替换 CI4 组件。将这些类放在任何地方,并在 app/Config/Services.php 中添加适当的服务方法来加载你的组件,而不是默认组件。
详细信息请参见 创建核心系统类。
升级库
你的应用类仍然可以放在 app/Libraries 中,但不必这样做。
不再使用 CI3 的
$this->load->library('x');
,现在可以使用$this->x = new \App\Libraries\X();
,遵循你组件的命名空间约定。或者,你可以使用 工厂:$this->x = \CodeIgniter\Config\Factories::libraries('X');
。CodeIgniter 3 中的一些库在版本 4 中不再存在。对于所有这些库,你必须找到一种新的方法来实现你的函数。这些库是 日历, FTP, Javascript, 购物车, 引用通告, XML-RPC /服务器 和 Zip 编码。
存在于两个 CodeIgniter 版本中的所有其他库都可以通过一些调整来升级。 最重要和使用最广泛的库都有一个升级指南,它将通过简单的步骤和示例帮助你调整代码。