【问题标题】:Best Practices for Laravel 4 Helpers and Basic Functions?Laravel 4 Helpers 和基本函数的最佳实践?
【发布时间】:2013-06-09 22:44:45
【问题描述】:

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

这样的最佳实践是什么?如何将其提供给 Blade 模板?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

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

    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 会更好。
    【解决方案3】:

    我这样做的方法是在 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 分钟摸摸头。
    【解决方案4】:

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

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

    【讨论】:

    • 我喜欢这种方法。更像是铁路。我们能否介绍一下如何在 trait 中添加所有 view-helper 方法并让它们在刀片视图中可用?
    • 老实说,我认为 PHP 不可能做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2021-07-03
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多