如何在 Laravel 中创建自定义辅助函数

Laravel 提供了很多优秀的 辅助函数 来处理数组、文件路径、字符串和路由等。

除此之外,你还可以利用 Composer 的自动加载机制为你的 Laravel 应用和 PHP 程序包定义自己的辅助函数。

接下来让我们来看看如何创建可以自动由 Laravel 加载的辅助函数。

创建方法

1、在 App 目录中创建一个 Helpers 文件

要在 Laravel 应用程序中引用辅助函数,你可以根据偏好决定辅助函数文件的位置,下面有几个建议的位置:

app/helpers.php
app/Http/helpers.php

这里更推荐保存在应用程序命名空间的根目录下 app/helpers.php

2、自动加载

要使用自定义的 PHP 辅助函数,首先要做的是,在运行时将它们加载到程序中。 事实上,在文件顶部看到下面这样的代码并不罕见:

require_once ROOT . '/helpers.php';

PHP 函数不能被自动加载,但是我们有比使用 requirerequire_once 更好的解决方案—— Composer。

你可以在 Laravel 的 composer.json 文件中看到 autoloadautoload-dev 这两个键:

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},

如果你想添加一个辅助函数的文件, composer.json 中有一个 files 键(这是一个文件路径的数组),你可以在 autoload 中定义:

"autoload": {
    "files": [
        "app/helpers.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

添加了新的路径到 files 数组中之后,你需要执行以下命令:

composer dump-autoload

现在,在每个请求中,helpers.php 文件将被自动加载,因为 Laravel 需要在 public/index.php 中使用 Composer 的自动加载器:

require __DIR__.'/../vendor/autoload.php';

3、定义函数

在辅助函数类中定义函数是很简单的,但是有些事情要注意:所有的 Laravel 辅助函数文件都包含在一个函数方法检查中,以避免函数定义冲突:

if (! function_exists('env')) {
    function env($key, $default = null) {
        // ...
    }
}

因为你可能会遇到你正在使用的函数定义,而你根本不知道哪一个是第一个定义的,这可能会变得棘手。

我更推荐在辅助函数文件中使用 function_exists 检查,但是如果在单个文件中定义辅助函数,那就不需要了。

如果跳过检查,你可能随时都会看到你的辅助函数与其他函数发生冲突,这可能对你重新考虑函数的命名来说很有用。

但在实践中,这种冲突不会像你想象的那样频繁发生,你只需要确保定义的函数不是过于通用即可。你也可以为你的函数名添加前缀,确保它们不会与其他依赖相冲突。

辅助函数示例

已知已有辅助方法 dd(),dump();他们输出内容,一个终止一个不终止,我想添加一个方法纪录数据到日志文件并且不停止程序,如下所示 dp():


/**
 * 日志纪录
 * User: wml
 * DateTime: 2021/4/23 下午3:32
 * @param mixed ...$vars
 */
if (!function_exists('dp')) {
    function dp(...$vars)
    {
       foreach ($vars as $v) {
           logger(print_r($v, true));
        }
     }
}

之后你可以在laravle项目的任意位置使用dp()方法打印数据

更多

查看 Composer 的 自动加载 文档,了解更多有关引用文件以及自动加载类的信息。

另一个建议是了解框架中所有的 Laravel 辅助函数,并通过阅读 Illuminate\Foundation helpersIlluminate\Support helpers 的源代码来了解它们的工作原理。

其他使用composer的框架添加辅助方法,同理。

引用链接

[1] 辅助函数: https://learnku.com/docs/laravel/8.5/helpers/10389
[2] 自动加载: https://getcomposer.org/doc/04-schema.md#autoload
[3] Illuminate\Foundation helpers: https://github.com/laravel/framework/blob/8.x/src/Illuminate/Foundation/helpers.php
[4] Illuminate\Support helpers: https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/helpers.php