153

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

像这样的最佳实践是什么?我如何使它可用于 Blade 模板?

4

4 回答 4

236

丑陋、懒惰和可怕的方式:在 . 末尾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,可能会提高性能)。

于 2013-06-13T15:29:38.140 回答
84

我这样做的方法是在/appLaravel 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 将自动加载该文件夹中的所有类/文件。这样就无需深入研究任何作曲家文件或运行作曲家命令。

不确定这是否是最佳实践,但它确实有效。

如果您创建了一个简单的文件/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'
于 2013-06-13T22:39:23.573 回答
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
    }

}

将它们保存在 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)和它有很多方法来格式化日期和时间。

于 2013-06-13T17:36:16.177 回答
7

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

额外的好处:您不需要创建额外的类并保持全局命名空间干净。

于 2014-07-31T14:38:01.070 回答