从 3.x 升级到 4.x

CodeIgniter 4 是框架的重写,并且不向后兼容。将你的应用程序转换更合适,而不是升级它。一旦你完成了转换,从 CodeIgniter 4 的一个版本升级到下一个版本将很简单。

“精简、敏捷、简单”的理念仍然保留,但实现与 CodeIgniter 3 有很多不同。

升级没有 12 步检查表。相反,请在一个新的项目文件夹中使用 CodeIgniter 4 的副本开始, 选择 你希望的安装和使用方式, 然后转换和集成你的应用组件。 我们将尽量指出这里最重要的注意事项。

为了升级你的项目,我们总结出两项主要工作。首先,有一些对每个项目都很重要的一般调整,必须处理。其次是 CodeIgniter 构建的库,包含一些最重要的函数。这些库可以互相独立工作,所以你必须一一查看它们。

在启动项目转换之前,请阅读用户指南!

一般调整

下载

命名空间

  • 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”。

  • Output

类加载

  • 不再有 CodeIgniter “超级对象”,其中框架组件引用以属性的形式神奇地注入到你的控制器中。

  • 类根据需要进行实例化,框架组件通过 服务 进行管理。

  • 自动加载程序 自动使用 PSR-4 风格定位类,在 App (app 文件夹)和 CodeIgniter (即 system 文件夹)顶级命名空间内;具有 Composer 自动加载支持。

  • 你可以配置类加载以支持你最习惯的任何应用程序结构,包括“HMVC”风格。

  • CI4 提供可以像 CI3 中的 $this->load 一样加载类和共享实例的 工厂

  • 你的应用类仍然可以放在 app/Libraries 中,但不必这样做。

  • 不再使用 CI3 的 $this->load->library('x'); ,现在可以使用 $this->x = new \App\Libraries\X();,遵循你组件的命名空间约定。或者,你可以使用 工厂:$this->x = \CodeIgniter\Config\Factories::libraries('X');

辅助函数

钩子

  • 钩子 已被 事件 替换。

  • 不再使用 CI3 的 $hook['post_controller_constructor'],现在使用 Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);,命名空间为 CodeIgniter\Events\Events;

  • 事件始终启用,并全局可用。

  • 挂钩点 pre_controllerpost_controller 已被移除。使用 控制器过滤器 代替。

  • 挂钩点 display_overridecache_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 版本中的所有其他库都可以通过一些调整来升级。 最重要和使用最广泛的库都有一个升级指南,它将通过简单的步骤和示例帮助你调整代码。