Laravel 4助手和基本函数的最佳实践?

154

我想了解将全局函数放置在Laravel 4中的最佳位置。例如,日期格式化。我认为创建一个门面不值得,因为门面过于模块化。我阅读了有关创建库文件夹并在其中存储类的文章,但对于一个简单的功能来说,这似乎也太多了。这样的“工具”难道不应该在Blade模板中可用吗?

对于这样的问题,最佳实践是什么,如何使其在Blade模板中可用?

4个回答

236
丑陋、懒惰和糟糕的方法: 在bootstrap/start.php末尾添加include('tools.php'),并将您的函数放置在新文件中。
清晰明了的方法: 创建一个库。这样只有在实际使用时才会自动加载它。
- 在app文件夹内创建一个libraries文件夹 - 创建您的库文件,在其中创建一个类,并添加静态函数 - 选项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
我认为你还需要在 start/global.php 中添加 app_path().'/library' - Alexandre Butynski
2
@AlexandreButynski 不错的观点。这将允许添加库而无需每次更新composer。我编辑了我的帖子以添加此内容。 - Alexandre Danault
@JasonSpick 是的,请确保将您的文件命名为 sitehelpers.php - Alexandre Danault
3
为什么需要将它添加到Composer的自动加载器以及global.php文件中? - CashIsClay
我该继承哪个类呢?如果我尝试在控制器的函数中引用我的类,例如'SiteHelpers::save($type);',会出现“找不到控制器方法”的错误提示。 - Himmators
显示剩余2条评论

84

我做这件事情的方式是在 Laravel 4 项目根目录的 /app 目录下创建一个新文件夹,然后将该文件夹添加到 /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 文件或运行 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
辅助程序应该是一个类吗?我能在这里定义一个简单的函数吗? - Positivity
2
如果您不编辑composer.json并且不运行composer dumpautoload,则此方法无法正常工作。 - Rommy
1
很棒的解决方案。正如Rommy所说,不要忘记运行composer dump-autoload - 我曾经因此浪费了20分钟。 - al_manchester

25

Laravel中的helpers.php方法是将其添加到您的composer.json文件中的“files”中(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
    }

}

将它们保存到 app/libraries 并添加到 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()设置为static会更好。 - XedinUnknown

7

我喜欢这种方法。更像是 Rail 风格。我们能否将所有的视图辅助方法放在一个 trait 中,并使它们在 Blade 视图中可用? - Bibek Shrestha
老实说,我认为用PHP做不到这一点。 - Franz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接