Laravel 4帮助程序和基本功能的最佳实践?


152

我试图了解在Laravel 4中放置全局函数的最佳位置。例如,日期格式。我认为制作外观不值得,因为外观过于模块化。我已经阅读了有关创建库文件夹并在其中存储类的文章,但是对于一个简单的函数来说,这似乎很多。Blade模板中不应该提供这样的“工具”吗?

此类最佳做法是什么?如何使它可用于Blade模板?

Answers:


233

丑陋,懒惰和糟糕的方式:在的末尾bootstrap/start.php,添加一个include('tools.php')并将您的函数放置在该新文件中。

干净的方法:创建一个库。这样,只有在您实际使用它时,它才会自动加载。

  • libraries文件夹内创建一个文件app
  • 创建您的库文件,在其中创建一个类,并向其中添加静态函数
  • 选项1:编辑start/global.php以添加app_path().'/libraries'ClassLoader::addDirectories( 阵列。
  • 选项2:编辑composer.json以添加"app/libraries"autoload阵列。跑composer dump-autoload
  • 从视图中调用类和静态函数。

关于您的选择,引用自global.php文件

除了使用Composer,您还可以使用Laravel类加载器加载控制器和模型。这对于在不更新Composer的情况下将所有类保留在“全局”名称空间中很有用。

您可以组合使用这两个选项,其中Laravel类加载器将自动在注册目录中搜索类(选项1,更容易),而Composer会保留所有类的记录,但只有在您对其进行更新之后(选项2,才可以提高性能)。


3
我认为您还必须将放置app_path().'/library'在start / global.php中。
Alexandre Butynski 2013年

2
@AlexandreButynski好点。这将允许添加库,而不必每次都更新作曲家。我编辑了帖子以添加此内容。
Alexandre Danault

因此,我创建了一个名为IDK ... SiteHelpers的类,然后定义了一个formatDate方法。然后在模板中,我应该能够执行SiteHelpers :: formatDate($ date)吗?
杰森·斯皮克

@JasonSpick是的,请确保您命名文件sitehelpers.php
Alexandre Danault 2013年

3
为什么需要将其以及global.php文件添加到作曲家的自动加载中?
CashIsClay13年

82

我的方法是/app在Laravel 4项目根目录下的目录中创建一个新文件夹。然后将此文件夹添加到文件的第一个数组中,/app/start/global.php如下所示:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

只要新/app/classes文件夹中的文件夹结构遵循您的命名空间惯例。Laravel 4将自动加载该文件夹中的所有类/文件。这样,就无需深入任何作曲家文件或运行composer命令。

不知道这是否是最佳做法,但确实可以。

如果您创建了一个简单的文件,/app/classes/Helpers/Helper.php例如:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

您需要做的就是打电话 Helpers\Helper::helloWorld();

您也可以在/app/config/app.php文件中将此助手类作为别名。只需在aliases数组末尾添加以下内容即可:

'Helper'          => 'Helpers\Helper'

4
我喜欢这种方式,因为您不必混入任何作曲家式的,干净而优雅的解决方案。+1
Gadoma

3
如果要将助手类添加到app.php文件,则现在可以像这样直接访问该类:Helper :: hellowWorld();
Helmut Granda

助手应该上课吗?我可以在这里定义一个简单的功能吗?
Webinan

2
如果您不编辑composer.json并且不运行composer dumpautoload,这将不起作用
Rommy 2014年

1
很好的解决方案。正如Rommy所说,别忘了跑步composer dump-autoload-我做了,花了20分钟挠头。
al_manchester

25

Laravel的helpers.php方法是将其添加到composer.json(https://github.com/laravel/framework/blob/master/composer.json)中的“文件”中:

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

我要做的是创建小型类(每个类几个方法,每个方法一行,从某物到DRY的所有扩展,这就是我的目标),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

将它们保存到应用程序/库中,并添加到composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

执行

composer dump

然后随便使用它们

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

观看有关重构的视频:http : //www.youtube.com/watch?v= DC-pQPq0acs

顺便说一句,我确定这只是一个示例,但是您可能不需要格式化日期的帮助程序,因为Laravel中的所有日期都是Carbon的实例(https://github.com/briannesbitt/Carbon)和它有许多格式化日期和时间的方法。


我自己不是静态方法的忠实拥护者,因此在必要时尝试使用实例方法。错误我很确定在这种用法的情况下,最好使用formatDDMMAAAA()as static
XedinUnknown

7

您也可以View::share()将其与闭包一起使用以实现此目的-我刚刚发布了以下内容:http : //www.develophp.org/2014/07/laravel-4-blade-helper-functions/

额外的好处:您无需创建额外的类,也无需保持全局名称空间的整洁。


我喜欢这种方法。更加轨范。我们能否通过某种方式将所有视图帮助器方法添加到特征中,并使它们在刀片视图中可用?
bibstha

老实说,我认为PHP无法实现。
弗朗兹(Franz)2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.