Laravel 4助手和基本功能的最佳实践?

时间:2013-06-13 13:56:24

标签: laravel laravel-4 laravel-blade laravel-helper

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

此类内容的最佳做法是什么?如何将其提供给Blade模板?

4 个答案:

答案 0 :(得分:232)

丑陋,懒惰和糟糕的方式:在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 ,可能会提高性能)。

答案 1 :(得分:82)

我这样做的方法是在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命令。

不确定这是否是最佳做法但确实有效。

如果您创建了一个名为/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'

答案 2 :(得分:25)

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

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

我所做的是创建小类(每个类有几个方法,每个方法一行,从某些东西扩展到干,这是我的目标),

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)的实例并且它有负载格式化日期和时间的方法。

答案 3 :(得分:7)

你也可以使用View::share()和闭包来实现这一点 - 我刚发布了这个:http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

增加了好处:您不需要创建额外的类,也可以保持全局命名空间的清洁。