助手函数

什么是助手?

顾名思义,助手可以帮助您完成任务。每个助手文件只是一个特定类别函数的集合。有 URL 助手,可以帮助您创建链接,有 表单助手 可以帮助您创建表单元素,测试助手 执行各种文本格式化例程,Cookie 助手 设置和读取 Cookie,文件系统助手 帮助您处理文件等等。

与 CodeIgniter 中的大多数其他系统不同,助手不是以面向对象的方式编写的。它们是简单的过程函数。每个助手函数执行一项特定任务,不依赖于其他函数。

CodeIgniter 默认情况下不会加载辅助文件,因此使用辅助文件的第一步是加载它。加载后,它将在您的 控制器视图 中全局可用。

辅助文件通常存储在您的 system/Helpersapp/Helpers 目录中。

加载辅助文件

注意

URL 辅助文件 始终加载,因此您无需自行加载它。

加载辅助文件

使用以下方法加载辅助文件非常简单

<?php

helper('name');

上面的代码加载了 name_helper.php 文件。

重要

CodeIgniter 辅助文件名称全部小写。因此,helper('Name') 在区分大小写的文件系统(如 Linux)上将不起作用。

例如,要加载 Cookie 辅助文件 文件(名为 cookie_helper.php),您需要执行以下操作

<?php

helper('cookie');

注意

helper() 函数不返回值,因此不要尝试将其分配给变量。只需按所示使用它即可。

自动发现和 Composer 包

默认情况下,CodeIgniter 将通过 自动发现 在所有定义的命名空间中搜索辅助文件。您可以通过 spark 命令检查定义的命名空间。请参阅 确认命名空间

如果您使用许多 Composer 包,您将拥有许多定义的命名空间。CodeIgniter 默认情况下会扫描所有命名空间。

为了避免浪费时间扫描不相关的 Composer 包,您可以手动指定用于自动发现的包。有关详细信息,请参阅 指定 Composer 包

或者您可以指定一个命名空间来加载您想要的助手。

加载顺序

helper() 函数将扫描所有定义的命名空间,并加载所有相同名称的匹配助手。这允许加载任何模块的助手,以及您为该应用程序专门创建的任何助手。

加载顺序如下

  1. app/Helpers - 这里加载的文件总是先加载。

  2. {namespace}/Helpers - 所有命名空间都按定义顺序循环遍历。

  3. system/Helpers - 基础文件最后加载。

加载多个助手

如果您需要一次加载多个助手,可以传入一个文件名数组,所有助手都会被加载。

<?php

helper(['cookie', 'date']);

在控制器中加载

助手可以在控制器的任何方法中加载(甚至在视图文件中加载,尽管这不是一个好习惯),只要您在使用它之前加载它。

您可以在控制器的构造函数中加载助手,这样它们就会在任何方法中自动可用,或者您可以在需要它的特定方法中加载助手。

但是,如果您想在控制器的构造函数中加载,可以使用控制器中的 $helpers 属性。请参阅 控制器

从指定命名空间加载

默认情况下,CodeIgniter 会在所有定义的命名空间中搜索助手文件并加载所有找到的文件。

如果您只想加载特定命名空间中的助手,请在助手名称前加上它所在的命名空间。在该命名空间目录中,加载器期望它位于名为 **Helpers** 的子目录中。一个例子将有助于理解这一点。

在这个例子中,假设我们已经将所有与博客相关的代码分组到它自己的命名空间中,Example\Blog。这些文件存在于我们服务器上的 Modules/Blog/ 目录下。因此,我们将博客模块的 Helper 文件放在 Modules/Blog/Helpers/ 目录下。一个名为 blog_helper 的文件将位于 Modules/Blog/Helpers/blog_helper.php。在我们的控制器中,我们可以使用以下命令来加载 Helper 文件

<?php

helper('Example\Blog\blog');

您也可以使用以下方式

<?php

helper('Example\Blog\Helpers\blog');

注意

以这种方式加载的文件中的函数实际上并不属于命名空间。命名空间仅仅被用作一个方便的定位文件的方式。

自动加载 Helper

新功能,从 4.3.0 版本开始。

如果您发现您需要在整个应用程序中全局使用某个特定的 Helper,您可以告诉 CodeIgniter 在系统初始化时自动加载它。这可以通过打开 app/Config/Autoload.php 文件并将 Helper 添加到 $helpers 属性中来实现。

使用 Helper

一旦您加载了包含您要使用的函数的 Helper 文件,您就可以像调用标准 PHP 函数一样调用它。

例如,要使用 anchor() 函数在您的视图文件中创建一个链接,您可以这样做

<div>
<?= anchor('blog/comments', 'Click Here') ?>
</div>

其中 Click Here 是链接的名称,而 blog/comments 是您要链接到的控制器/方法的 URI。

创建 Helper

创建自定义 Helper

Helper 文件名是 Helper 名称_helper.php

例如,要创建信息助手,您需要创建一个名为 **app/Helpers/info_helper.php** 的文件,并在文件中添加一个函数

<?php

// app/Helpers/info_helper.php
use CodeIgniter\CodeIgniter;

/**
 * Returns CodeIgniter's version.
 */
function ci_version(): string
{
    return CodeIgniter::CI_VERSION;
}

您可以在单个助手文件中添加任意数量的函数。

“扩展”助手

要“扩展”助手,请在您的 **app/Helpers** 文件夹中创建一个与现有助手同名的文件。

如果您只需要向现有助手添加一些功能 - 比如添加一两个函数,或者更改特定助手函数的操作方式 - 那么用您的版本替换整个助手就显得过分了。在这种情况下,最好简单地“扩展”助手。

注意

术语“扩展”使用得比较宽泛,因为助手函数是过程式的和离散的,不能以传统编程意义上的方式扩展。在幕后,这使您能够添加或替换助手提供的函数。

例如,要扩展本地的 **数组助手**,您需要创建一个名为 **app/Helpers/array_helper.php** 的文件,并添加或覆盖函数

<?php

// any_in_array() is not in the Array Helper, so it defines a new function
function any_in_array($needle, $haystack)
{
    $needle = is_array($needle) ? $needle : [$needle];

    foreach ($needle as $item) {
        if (in_array($item, $haystack, true)) {
            return true;
        }
    }

    return false;
}

// random_element() is included in Array Helper, so it overrides the native function
function random_element($array)
{
    shuffle($array);

    return array_pop($array);
}

重要

不要指定命名空间 App\Helpers

有关助手文件加载顺序,请参见 加载顺序

现在怎么办?

在目录中,您将找到所有可用 助手 的列表。浏览每个助手以了解它们的功能。