在Laravel中创建自己的PHP帮助函数

Laravel 为我们提供了许多内置的帮助函数,你可以在应用程序中的任何位置调用它。它们使你可以方便地处理数组和对象,路径,字符串,URL和其他类型的工作流。

尽管在 Laravel 核心中定义了许多帮助函数,但你可以在 Laravel 中定义自己的帮助函数以避免重复相同的代码。它确保你的应用程序有更好的可维护性。

我们来看看如何创建自己的定制 Laravel 帮助函数

Laravel 中的帮助函数

Laravel 中有许多内置的帮助程序可供你的应用程序使用。它们根据它们提供的功能类型进行分组。这是一个完整的内置 Laravel 帮助文件。

数组和对象

在这个组中,助手提供了处理数组和对象的能力。 该组包含用于添加两个数组的辅助函数,将多维数组折叠成单个数组,返回数组的第一个元素,检查数组中是否存在给定的项目或项目,并执行许多其他类型的操作。

路径

这组helper返回Laravel应用程序中不同目录的绝对路径,例如 app,config,public,resource,storage和你的应用程序的基本路径。

字符串

该组中的助手使用字符串操作。 你可以将字符串转换为骆驼大小写,找到该类的基本名称,运行 htmlspecialchars,将文本转换为kebab大小写,将文本转换为大小写,并执行许多其他类型的字符串操作。

URL

助手的URLs组与生成URL一起工作。你可以为控制器操作生成URL,命名为route,以及指定路径的完全限定URL。

杂项

这类帮助程序包含处理页面状态,服务容器,认证,缓存等功能。

在Laravel中创建帮助文件

在本节中,我们将通过创建Laravel帮助程序文件,该文件可以在Laravel应用程序中全局使用。 你可以组织你的帮助程序文件的位置,但是,我更愿意将我的Laravel项目帮助程序文件保存在 app/Helpers/Helper.php 中。 在本教程中,我们将在我想要的位置创建一个帮助文件。

创建一个帮助文件

你可以将你的帮助程序文件放在你的Laravel应用程序的任何位置,将它放在你的应用程序目录下是标准的。
让我们在app下创建一个 Helpers 目录并创建一个 Helper.php 文件。这些是该文件的以下内容。

<?php

if (!function_exists('human_file_size')) {
    /**
     * Returns a human readable file size
     *
     * @param integer $bytes
     * Bytes contains the size of the bytes to convert
     *
     * @param integer $decimals
     * Number of decimal places to be returned
     *
     * @return string a string in human readable format
     *
     * */
    function human_file_size($bytes, $decimals = 2)
    {
        $sz = 'BKMGTPE';
        $factor = (int)floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . $sz[$factor];

    }
}

if (!function_exists('in_arrayi')) {

    /**
     * Checks if a value exists in an array in a case-insensitive manner
     *
     * @param mixed $needle
     * The searched value
     *
     * @param $haystack
     * The array
     *
     * @param bool $strict [optional]
     * If set to true type of needle will also be matched
     *
     * @return bool true if needle is found in the array,
     * false otherwise
     */
    function in_arrayi($needle, $haystack, $strict = false)
    {
        return in_array(strtolower($needle), array_map('strtolower', $haystack), $strict);
    }
}

如果你正在使用一个类并且它的方法是你的助手,你可以用命名空间声明来启动这个文件。

namespace App\Helpers;

如果你不使用命名空间声明,则这些函数将变为全局可用,你甚至可以在不指定名称空间的情况下使用它们。 所有Laravel内置的帮助函数都是在没有命名空间的情况下定义的。 此外,助手类也将在全局范围内提供。 因此,如果你想在不指定命名空间的情况下使用助手,只需删除这一行。

定义这些函数时有一些注意事项。所有的Laravel助手文件函数都会被检查以避免函数定义冲突。

if (!function_exists('human_file_size')) {
    function human_file_size($bytes, $decimals = 2)
    {
        // ...
    }
}

如果跳过此检查,则每次重新定义具有相同定义的函数时都会发生冲突。你可以使用这个检查,或者你也可以用你的函数名称作为前缀来避免冲突。

使用帮助文件

现在,就我们的帮助文件而言,就是这样。让我们看看如何在Laravel应用程序中使用助手文件。

  • 你可以使用 composer 自动加载助手文件。然后,你可以在应用程序的任何位置使用这些功能。
  • 你也可以使用Laravel服务提供者注册此文件。 Laravel会将其与其他依赖关系一起加载。
  • 你也可以使用一个包含所有这些功能的软件包。

让我们看看如何使用所有这些方法。

通过Composer自动加载

第一个非常简单直接。 只需转到位于Laravel项目中的 composer.json 文件,你将看到自动加载 key。 Composer 有一个key files(你想自动加载的文件路径数组),你可以在自动 `autoload 中使用它。 如:

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

更改composer.json文件并向文件数组添加新路径后,需要重新生成自动加载文件。只需从Laravel项目目录中的终端运行此命令即可。

composer dump-autoload

现在,你的帮助程序文件将自动加载到你的Laravel项目中。

通过服务提供者加载

让我们来看看如何使用服务提供者来自动加载助手文件。转至应用程序根目录中的命令行并运行以下命令以创建新的服务提供者。

php artisan make:provider HelperServiceProvider

将会提示运行结果

Provider created successfully.

一旦服务提供者成功创建,打开该文件。在注册方法中添加你的助手文件。

public function register()
{
    $file = app_path('Helpers/Helper.php');
    if (file_exists($file)) {
        require_once($file);
    }
}

在注册方法中,我们包含了我们的依赖关系。 在大型项目中,你可能在目录中有多个帮助程序文件,并且你想要全部这些文件。 你可以更改注册方法,如下所示,你的服务提供商将加载Helpers目录中的所有文件。

public function register()
{
    foreach (glob(app_path() . '/Helpers/*.php') as $file) {
        require_once($file);
    }
}

它将需要 app/Helpers 目录中的所有文件。
现在我们的服务提供者已经完成,我们需要注册我们的服务提供者,所以,Laravel会在引导期间加载它。 为此,请转至 config/app.php 并在结尾处的 providers 数组中添加以下行。

App\Providers\HelperServiceProvider::class,

如果你的帮助文件涉及到一个拥有这些帮助方法的类,并且你已经指定了命名空间,那么你可以通过定义一个别名来毫不费力地使用它们。 您可以通过在 config/app.php 文件中的别名数组末尾添加以下内容轻松完成此操作。

'Helper' => App\Helpers\Helper::class,

通过将这添加到别名数组中,你将能够使用Helper关键字调用助手。这就是为服务提供者创建你的帮手。

使用第三方包加载

你也可以使用第三方package: Laravel helpers package。你可以通过在控制台中从你的应用程序的根目录运行此命令来通过编写器安装它。

composer require browner12/helpers

config/app.php 中的 providers 数组中添加以下行

browner12\helpers\HelperServiceProvider::class,

如果你正在使用Laravel的自动包发现功能,则可以跳过此步骤。 完成必要的步骤之后,你可以使用此命令创建助手文件。

php artisan make:helper Helper

它将在 App\Helpers 中创建一个 Helper.php 文件,你可以轻松添加所有帮助程序功能。

Helper 的具体使用

现在我们的函数在Helper文件中定义,没有定义名称空间,我们可以很容易地使用它们。 只需在 routes/web.php 中找到你的路由文件,并将此功能用于首页。 例如,这是完整的 routes/web.php 文件:

<?php

Route::get('/', function () {
    return human_file_size(1024*1024);
});

它将简单地返回作为参数传递的字节数的可读大小。你可以从任何地方控制器或视图调用这些函数。

资源

欢迎留言讨论。

更多PHP相关,请前往PHPCasts

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Laravel提供了许多优秀的辅助函数 可以方便的操作数组、文件路径、字符串以及路由,比如我们爱用的dd()方法(...
    summerbluet阅读 678评论 0 1
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,603评论 0 121
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 第三次,遇曰 日更变成周更,连周更都没有了,变成了心情日记。这两个月错过的事情很多很多,懊恼?愧疚?不甘?五味杂陈...
    遇曰阅读 249评论 0 0
  • 作者:糖长老 肖凯年幼的时候,跟妈妈在老家过生活,妈妈对他很宝贝,肖凯被养的跟温室里的草莓一样,鲜嫩也多汁,稍微受...
    续事创意写作工作室阅读 640评论 0 4