ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


A
Alexandre Danault

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

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

在您的应用程序文件夹中创建一个库文件夹

创建您的库文件,在其中创建一个类,然后向其中添加静态函数

选项 1:编辑 start/global.php 以将 app_path().'/libraries' 添加到 ClassLoader::addDirectories( 数组。

选项 2:编辑 composer.json 以将“app/libraries”添加到自动加载数组。运行作曲家转储自动加载

从您的视图中调用您的类和静态函数。

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

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

您可以结合使用这两个选项,Laravel 类加载器将自动在注册目录中搜索类(选项 1,更简单),Composer 将记录所有类,但仅在您更新它之后(选项 2,可能会提高性能)。


我认为您还必须将 app_path().'/library' 放在 start/global.php 中。
@AlexandreButynski 好点。这将允许添加库而不必每次都更新作曲家。我编辑了我的帖子以添加此内容。
所以我创建了一个名为 IDK... SiteHelpers 的类,然后定义了一个方法 formatDate。然后在模板中我应该能够做到 SiteHelpers::formatDate($date) ?
@JasonSpick 是的,并确保将文件命名为 sitehelpers.php
为什么需要将它添加到作曲家的自动加载以及 global.php 文件中?
J
JasonMortonNZ

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

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

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

我喜欢这种方式,因为您不必与任何作曲家风格的东西混在一起,这是一个干净而优雅的解决方案。 +1
如果您要将帮助程序类添加到 app.php 文件中,您现在可以像这样直接访问该类:Helper::hellowWorld();
助手应该是一个类吗?我可以在这里定义一个简单的函数吗?
如果您不编辑 composer.json 并且不运行 composer dumpautoload,这将不起作用
很好的解决方案。正如 Rommy 所说,不要忘记运行 composer dump-autoload - 我这样做了,花了 20 分钟挠头。
i
iconoclast

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


我自己并不是静态方法的忠实拥护者,并在必要时尝试使用实例方法。错误 我很确定在这种用法的情况下,将 formatDDMMAAAA() 用作 static 会更好。
F
Franz

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

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


我喜欢这种方法。更像是铁路。我们能否介绍一下如何在 trait 中添加所有视图辅助方法并让它们在刀片视图中可用?
老实说,我认为 PHP 不可能做到这一点。