从 3.x 升级到 4.x

CodeIgniter 4 是该框架的重写版本,不向后兼容。更恰当的做法是考虑转换您的应用,而不是升级它。一旦您完成此操作,从一个 CodeIgniter 4 版本升级到下一个版本将变得很简单。

“精简、精炼且简单”的理念得以保留,但与 CodeIgniter 3 相比,实现方式有很多不同之处。

没有 12 步升级清单。相反,从新项目文件夹中的 CodeIgniter 4 副本开始,无论您希望如何安装和使用它,然后转换并集成您的应用组件。我们将在本文中重点指出最重要的注意事项。

为了升级您的项目,我们想出了您必须处理的两项主要任务。首先,有一些对每个项目都很重要的常规调整,必须处理。第二个是构建 CodeIgniter 的库,其中包含一些最重要的函数。这些库彼此独立运行,因此您必须逐个查看它们。

在开始项目转换之前,请务必阅读用户指南!

通用调整

下载

命名空间

  • 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 类转换的分步说明

类加载

  • CodeIgniter 中不再有“超级对象”,框架组件引用不会神奇地注入为控制器的属性。

  • 类在需要时实例化,框架组件由 服务 管理。

  • 自动加载器 自动处理 PSR-4 样式类定位,在 Appapp 文件夹)和 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');

帮助器

  • 帮助器 与以前几乎相同,尽管有些已经简化。

  • 自 v4.3.0 起,你可以通过 app/Config/Autoload.php 以及 CI3 自动加载帮助器。

  • CodeIgniter 3 中的一些助手在版本 4 中已不存在。对于所有这些助手,您必须找到一种新的方法来实现您的功能。这些助手为 CAPTCHA 助手电子邮件助手路径助手表情助手

  • 下载助手 在 CI3 中已被移除。您需要在使用 force_download() 的地方使用 Response 对象。请参见 强制文件下载

  • 语言助手 在 CI3 中已被移除。但 lang() 在 CI4 中始终可用。请参见 lang()

  • 排版助手 在 CI3 中将成为 排版库 在 CI4 中。

  • 目录助手文件助手 在 CI3 中将成为 文件系统助手 在 CI4 中。

  • 字符串助手 函数在 CI3 中包含在 文本助手 中在 CI4 中。

  • 在 CI4 中,redirect() 与 CI3 的完全不同。
    • redirect() 文档 CodeIgniter 3.X

    • redirect() 文档 CodeIgniter 4.X

    • 在 CI4 中,redirect() 返回一个 RedirectResponse 实例,而不是重定向并终止脚本执行。您必须从控制器或控制器过滤器中返回它。

    • 在调用 redirect() 之前设置的 Cookie 和标头不会自动传递到 RedirectResponse。如果您想发送它们,则需要手动调用 withCookies()withHeaders()

    • 您需要将 CI3 的 redirect('login/form') 更改为 return redirect()->to('login/form')

钩子

  • 钩子已被事件取代。

  • 现在使用Events::on('post_controller_constructor', ['MyClass', 'MyFunction']);替换 CI3 的$hook['post_controller_constructor'],其中命名空间为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 中不再存在。对于所有这些库,您必须找到一种新的方式来实现您的功能。这些库是 日历FTPJavascript购物车引用XML-RPC /-ServerZip 编码

  • CI3 的 输入 对应于 CI4 的 IncomingRequest

  • CI3 的 输出 对应于 CI4 的 响应

  • 所有其他在 CodeIgniter 两个版本中都存在的库都可以通过一些调整进行升级。最重要且使用最广泛的库收到了升级指南,该指南将通过简单的步骤和示例帮助您调整代码。