升级控制器

文档

变更点

  • 由于 CodeIgniter 4 添加了命名空间,必须对控制器进行更改以支持命名空间。

  • CI4 控制器的构造函数不会自动将核心类加载到属性中。

  • CI4 的控制器有一个特殊的构造函数 initController()

  • CI4 为你提供了 RequestResponses 对象来使用 - 比 CI3 的方式更强大。

  • 如果你需要一个基类控制器(CI3 中的 MY_Controller),请使用 app/Controllers/BaseController.php

  • 在控制器中调用 echo,如同在 CI3 中一样,仍然被支持,但建议从控制器返回字符串或 Response 对象。

升级指南

  1. 首先,将所有控制器文件移动到 app/Controllers 文件夹中。

  2. 在打开的 php 标签之后添加此行:namespace App\Controllers;

  3. extends CI_Controller 替换为 extends BaseController

  4. 如果存在,请删除 defined('BASEPATH') OR exit('No direct script access allowed'); 这一行。

如果你在控制器结构中使用子目录,则必须根据情况更改命名空间。 例如,你有一个版本 3 控制器位于 application/controllers/users/auth/Register.php, 则命名空间必须是 namespace App\Controllers\Users\Auth;, 版本 4 中的控制器路径应如下所示:app/Controllers/Users/Auth/Register.php。 请确保子目录的首字母大写。
之后,你必须在命名空间定义下面插入一个 use 语句,以扩展 BaseController:: use App\Controllers\BaseController;

代码示例

CodeIgniter 3.x 版本

路径:application/controllers:

<?php

class Helloworld extends CI_Controller
{
    public function index($name)
    {
        echo 'Hello ' . html_escape($name) . '!';
    }
}

CodeIgniter 4.x 版本

路径:app/Controllers:

<?php

namespace App\Controllers;

class Helloworld extends BaseController
{
    public function index($name)
    {
        return 'Hello ' . esc($name) . '!';
    }
}