在 Laravel 项目中创建您自己的 PHP 助手

2024 年 4 月 1 日

Laravel 提供了许多优秀的 辅助函数 可以方便地执行诸如处理数组、文件路径、字符串和路由等操作,以及其他类似的操作 dd() 功能。

您还可以为 Laravel 应用程序和 PHP 包定义自己的一组辅助函数,方法是使用 Composer 自动导入它们。

如果您是 Laravel 或 PHP 的新手,让我们介绍一下如何创建自己的帮助器函数,由 Laravel 自动加载。

在 Laravel 应用程序中创建 Helpers 文件

您可能想要包含辅助函数的第一个场景是在 Laravel 应用程序的上下文中。根据您的喜好,您可以根据需要组织帮助文件的位置,但是,这里有一些建议的位置:

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

我更喜欢把我的留在 app/helpers.php 在应用程序命名空间的根目录中。

自动加载

要使用 PHP 辅助函数,您需要在运行时将它们加载到您的程序中。在我职业生涯的早期,在文件顶部看到这种代码并不罕见:

require_once ROOT . '/helpers.php';

PHP 函数无法自动加载。然而,我们通过 Composer 有一个比使用更好的解决方案 require 或者 require_once

如果你创建一个新的 Laravel 项目,你会看到 autoloadautoload-dev 键在 composer.json 文件:

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

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

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

添加新路径后 files 数组,您需要转储自动加载器:

composer dump-autoload

现在,对于每个请求,helpers.php 文件都会自动加载,因为 Laravel 需要 Composer 的自动加载器 public/index.php :

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

定义函数

在助手类中定义函数是很容易的部分,尽管有一些注意事项。所有 Laravel 帮助程序文件都包含在检查中以避免函数定义冲突:

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

这可能会变得很棘手,因为您可能会遇到这样的情况:您使用的函数定义是您没有预料到的(基于第一个定义的函数定义)。

我更喜欢使用 function_exists 检查我的应用程序助手,但是如果您在应用程序的上下文中定义助手,那么您 可以 放弃 function_exists 查看。

通过跳过检查,每当您的助手重新定义函数时,您都会看到冲突,这可能很有用。

在实践中,冲突并不像您想象的那么频繁发生,并且您应该确保定义的函数名称不是过于通用。您还可以为函数名称添加前缀,以减少它们与其他依赖项发生冲突的可能性。

帮助示例

我喜欢在定义资源丰富的路线时免费获得的 Rails 路径和 URL 帮助程序。例如,一个 photos 资源路由会暴露路由助手,例如 new_photo_path 、编辑照片路径`等

当我在 Laravel 中使用资源路由时,我喜欢添加一些辅助函数,以便更轻松地在模板中定义路由。在我的实现中,我喜欢有一个 URL 辅助函数,我可以传递 Eloquent 模型并使用我定义的约定获取资源路由,例如:

create_route($model);
edit_route($model);
show_route($model);
destroy_route($model);

您可以按照以下方式定义 show_route 在你的 app/helpers.php 文件(其他看起来类似):

if (! function_exists('show_route')) {
    function show_route($model, $resource = null)
    {
        $resource = $resource ?? plural_from_model($model);

        return route("{$resource}.show", $model);
    }
}

if (! function_exists('plural_from_model')) {
    function plural_from_model($model)
    {
        $plural = Str::plural(class_basename($model));

        return Str::kebab($plural);
    }
}

plural_from_model() function 只是一些可重用的代码,辅助路由函数使用它们来根据我喜欢的命名约定(模型的短横线复数形式)预测路由资源名称。

例如,以下是从模型派生的资源名称的示例:

$model = new App\LineItem;
plural_from_model($model);
// => line-items

plural_from_model(new App\User);
// => users

使用此约定,您可以像这样定义资源路由 routes/web.php :

Route::resource('line-items', 'LineItemsController');
Route::resource('users', 'UsersController');

然后在刀片模板中,您可以执行以下操作:

<a href="{{ show_route($lineItem) }}">
    {{ $lineItem->name }}
</a>

这会产生类似以下 HTML 的内容:

<a href="http://localhost/line-items/1">
    Line Item #1
</a>

套餐

您的 Composer 包还可以使用帮助程序文件来实现您希望为使用您的包的项目提供的任何帮助程序函数。

您将在包的 composer.json 文件,定义一个 files 包含一系列辅助文件的密钥。

您必须添加 function_exists() 检查您的辅助函数,以便使用您的代码的项目不会因命名冲突而中断。

您应该选择对您的包来说唯一的正确函数名称,如果您担心函数名称太通用,请考虑使用短前缀。

了解更多

看看作曲家的 自动加载 文档以了解有关包含文件的更多信息以及有关自动加载类的一般信息。


帖子 在 Laravel 项目中创建您自己的 PHP 助手 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 直接在您的收件箱中获取所有此类最新的 Laravel 文章。