在 Laravel 项目中创建属于你自己的辅助方法

UJ2FXDsehS.png

Laravel提供了许多优秀的辅助函数 可以方便的操作数组、文件路径、字符串以及路由,比如我们爱用的dd()方法(并不。)。

你可以为你的laravel应用和PHP包定义自己的辅助函数,通过Composer自动加载引入。

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

Laravel 应用中新建 helpers 文件

第一件事是要在你的 Laravel 应用中加入 helpers 文件。helpers 文件放在哪个文件夹下,这取决于你自己的个人喜好。这边有几个建议放置 helpers 文件的路径:

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

本人更倾向于: app/helpers.php

自动加载

要使用PHP辅助方法, 你需要在运行时将它们加载到程序中. 在我职业生涯的初期, 在文件顶部看到这样的代码并不少见:

require_once ROOT . '/helpers.php';

PHP 函数不能自动加载. 然而,我们有一个比使用requirerequire_once更好的解决方案。

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

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

如果你想添加一个helpers 文件, composer有一个 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 来检查我的辅助函数, 但如果你是在你的应用上下文中定义辅助函数, 你 可以 不使用 function_exists 来做检查。

如果跳过检查, 每当你重复定义某个辅助函数的时候都会发生冲突, 可见检查是很有用的。

在实际情况中,冲突并不会像你想象的那样经常发生, 而你也应当确保你定义的函数名称不要过于常见。 你也可以为你的函数名称加上前缀以确保他们不会与其他相关函数发生冲突。

Helper Example

我喜欢Rails的路径和URL辅助,当你定义一个丰富的路由时,你可以免费得到这些辅助。 例如, 一个 photos资源路由会暴露路由的辅助方法, 就像 new_photo_path, edit_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() 方法是仅仅一些可复用的代码,辅助路由的方法用这些代码来预测资源路由的基于我喜欢的命名规则的名字,这个命名规则是一个kebab-case(全小写并且分开的单词组,例如 "hello-world-hi")模型的复数。

例如,这里有一个来自模型资源名的例子:

$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');

然后在你的blade模板里面,你可以做以下操作:

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

它会生成如下的HTML:

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

Packages

你的Composer包也可以使用一个辅助文件来帮你在项目里使用任何你想要的辅助函数。

你将在 composer.json 文件采用相同的方法, 定义一个 files 键在你的辅助文件的一个数组。

添加function_exists() 来检查你的辅助函数是必要的,所以使用了你的代码的项目不会因命名冲突而中断。

你应该选择正确的在你包里是唯一的名字,并且如果你担心的方法名太普遍,可以考虑使用短前缀。

了解更多

查看 Composer的 autoloading 文档来了解更多关于引入文件,以及关于自动加载类的一些基本信息.

另一个推荐的资源是学习框架中所有适用的 Laravel helpers并且通过查看Illuminate\Foundation helpersIlluminate\Support helpers的源码学习他们是如何工作的.

讨论请前往:在 Laravel 项目中创建属于你自己的辅助方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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 China社区的文章 - 分享下团队的开发规范 ——《Laravel...
    knghlp508阅读 7,868评论 0 28
  • 一、框架概述 课程概述 laravel 4天(之前TP框架还是很大的区别)(国外框架) 在线教育平台 6天(lar...
    大大的世界小小的梦想_97ef阅读 1,349评论 0 2
  • Awesome PHP 一个PHP资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、W...
    guanguans阅读 5,748评论 0 47
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,956评论 1 66
  • 发从今日白,花是去年红。何须待零落,然后知始空。
    八斗才001阅读 116评论 3 1