从 3.x 升级到 4.x
CodeIgniter 4 是该框架的重写版本,不向后兼容。更恰当的做法是考虑转换您的应用,而不是升级它。一旦您完成此操作,从一个 CodeIgniter 4 版本升级到下一个版本将变得很简单。
“精简、精炼且简单”的理念得以保留,但与 CodeIgniter 3 相比,实现方式有很多不同之处。
没有 12 步升级清单。相反,从新项目文件夹中的 CodeIgniter 4 副本开始,无论您希望如何安装和使用它,然后转换并集成您的应用组件。我们将在本文中重点指出最重要的注意事项。
为了升级您的项目,我们想出了您必须处理的两项主要任务。首先,有一些对每个项目都很重要的常规调整,必须处理。第二个是构建 CodeIgniter 的库,其中包含一些最重要的函数。这些库彼此独立运行,因此您必须逐个查看它们。
在开始项目转换之前,请务必阅读用户指南!
通用调整
下载
CI4 仍以 即用型 zip 或 tarball 的形式提供。
它还可以使用 Composer 进行安装。
命名空间
CI4 专为 PHP 7.4+ 而构建,框架中的所有内容都使用命名空间,helper 和 lang 文件除外。
应用程序结构
application 文件夹已重命名为 app,框架仍然有 system 文件夹,其解释与之前相同。
该框架现在提供一个 public 文件夹,用作应用程序的文档根目录。
defined('BASEPATH') OR exit('No direct script access allowed');
行不是必需的,因为在标准配置中,public 文件夹之外的文件不可访问。CI4 不再定义常量BASEPATH
,因此请删除所有文件中的该行。还有一个 writable 文件夹,用于保存缓存数据、日志和会话数据。
app 文件夹看起来与 CI3 的 application 非常相似,有一些名称更改,还有一些子文件夹已移至 writable 文件夹。
不再有嵌套的 application/core 文件夹,因为我们有不同的机制来扩展框架组件(见下文)。
路由
模型、视图和控制器
CodeIgniter 基于 MVC 概念。因此,模型、视图和控制器上的更改是您必须处理的最重要的事情之一。
在 CodeIgniter 4 中,模型现在位于 app/Models 中,您必须添加行
namespace App\Models;
以及use CodeIgniter\Model;
,紧跟在 PHP 开头标签之后。最后一步是将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 类转换的分步说明
类加载
库
你的应用类仍然可以放在 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 助手、电子邮件助手、路径助手 和 表情助手。
下载助手 在 CI3 中已被移除。您需要在使用
force_download()
的地方使用 Response 对象。请参见 强制文件下载。- 在 CI4 中,
redirect()
与 CI3 的完全不同。 在 CI4 中,
redirect()
返回一个RedirectResponse
实例,而不是重定向并终止脚本执行。您必须从控制器或控制器过滤器中返回它。在调用
redirect()
之前设置的 Cookie 和标头不会自动传递到RedirectResponse
。如果您想发送它们,则需要手动调用withCookies()
或withHeaders()
。您需要将 CI3 的
redirect('login/form')
更改为return redirect()->to('login/form')
。
- 在 CI4 中,
钩子
现在使用
Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);
替换 CI3 的$hook['post_controller_constructor']
,其中命名空间为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 /-Server 和 Zip 编码。
CI3 的 输入 对应于 CI4 的 IncomingRequest。
所有其他在 CodeIgniter 两个版本中都存在的库都可以通过一些调整进行升级。最重要且使用最广泛的库收到了升级指南,该指南将通过简单的步骤和示例帮助您调整代码。