Laravel 提供了很多优秀的 辅助函数 来处理数组、文件路径、字符串和路由等。
除此之外,你还可以利用 Composer
的自动加载机制为你的 Laravel 应用和 PHP 程序包定义自己的辅助函数。
接下来让我们来看看如何创建可以自动由 Laravel 加载的辅助函数。
要在 Laravel 应用程序中引用辅助函数,你可以根据偏好决定辅助函数文件的位置,下面有几个建议的位置:
app/helpers.php
app/Http/helpers.php
这里更推荐保存在应用程序命名空间的根目录下 app/helpers.php
。
要使用自定义的 PHP 辅助函数,首先要做的是,在运行时将它们加载到程序中。 事实上,在文件顶部看到下面这样的代码并不罕见:
require_once ROOT . '/helpers.php';
PHP 函数不能被自动加载,但是我们有比使用 require
或 require_once
更好的解决方案—— Composer。
你可以在 Laravel 的 composer.json
文件中看到 autoload
和 autoload-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';
在辅助函数类中定义函数是很简单的,但是有些事情要注意:所有的 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 helpers 和 Illuminate\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