助手函数
什么是助手?
顾名思义,助手可以帮助您完成任务。每个助手文件只是一个特定类别函数的集合。有 URL 助手,可以帮助您创建链接,有 表单助手 可以帮助您创建表单元素,测试助手 执行各种文本格式化例程,Cookie 助手 设置和读取 Cookie,文件系统助手 帮助您处理文件等等。
与 CodeIgniter 中的大多数其他系统不同,助手不是以面向对象的方式编写的。它们是简单的过程函数。每个助手函数执行一项特定任务,不依赖于其他函数。
CodeIgniter 默认情况下不会加载辅助文件,因此使用辅助文件的第一步是加载它。加载后,它将在您的 控制器 和 视图 中全局可用。
辅助文件通常存储在您的 system/Helpers 或 app/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()
函数将扫描所有定义的命名空间,并加载所有相同名称的匹配助手。这允许加载任何模块的助手,以及您为该应用程序专门创建的任何助手。
加载顺序如下
app/Helpers - 这里加载的文件总是先加载。
{namespace}/Helpers - 所有命名空间都按定义顺序循环遍历。
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
。
有关助手文件加载顺序,请参见 加载顺序。
现在怎么办?
在目录中,您将找到所有可用 助手 的列表。浏览每个助手以了解它们的功能。