【问题标题】:Auto-loading Helpers in laravel 4laravel 4 中的自动加载助手
【发布时间】:2025-12-23 14:00:10
【问题描述】:

我一直在尝试让 Laravel 4 从 app/helpers 目录自动加载帮助文件(显然是我创建的)。

我从 Composer 的方式开始:将路径添加到 composer.json,然后运行 ​​dump-autoload。这没有用。然后我尝试使用app/start/global.php 文件,但它也不起作用。

注意,我不会将类放入帮助文件中——这就是 Facades 和 Packages 的用途。我只需要小的帮助函数,类似于 Laravel 自己的那些(在 vendor 目录中)。我之所以这么说,是因为作曲家似乎只转储了类(带有命名空间)。

如何让助手自动加载?

更新

ClassLoader::addDirectories() 函数似乎也不适用于类 - 那为什么会出现呢?我必须同时使用这个和 Composer 吗?

编辑

我的问题似乎没有被理解。在我的app/helpers 目录中,我有一个名为paths.php 的文件。我希望能够在全局范围内调用其中的函数 (theme_path($location))。

【问题讨论】:

  • 您有任何代码,以便我们更好地了解您要加载的文件中的内容吗?
  • 只是一个简单的函数:theme_path($location),它返回Config::get('site.theme') . "/$location"

标签: laravel laravel-4 composer-php autoload helpers


【解决方案1】:

嗯...我可以向您展示我的作曲家和助手,以展示我是如何使其工作的:

"autoload": {

    "psr-0": {
        "Helpers": "app/libraries"
    }
}

然后在 app/libraries/Helpers/DateHelper.php 中(例如)

<?php namespace Helpers;

class DateHelper extends \DateTime {


}

创建帮助文件后,我只需运行

作曲家转储自动加载

现在只需将您的助手用作 Helpers\DateHelper

【讨论】:

  • 就像我说的,我没有在这里使用类。只是功能。
【解决方案2】:

与您的问题没有直接关系,但 Laravel 集成了 Carbon 库 (https://github.com/briannesbitt/Carbon) 用于日期处理。它在vendor/nesbot 文件夹中,所以你可以直接在 Laravel 中使用它。

【讨论】:

    【解决方案3】:

    您需要执行以下操作:

    "autoload": {
        "files": [
            "file location go here"
        ]
    },
    

    然后您就可以使用帮助文件中的功能了。但是值得注意的是,这将在每个请求上显式加载文件。详情请见http://getcomposer.org/doc/04-schema.md#files

    我建议除非这是一个大量使用的帮助文件,否则请避免这样做,只需使用名称空间和类来组织它以避免命名冲突。

    【讨论】:

    • 该死,所以我不能让它与目录一起工作?我想这似乎是合理的 - 此外,不会有那么多帮助文件......
    • 您也可以遍历文件目录并使用 require,因为文件 composer autoload 模式中的每个文件都等同于 composer 生成的 autoload_real.php 中的 require 语句。
    【解决方案4】:

    自动加载仅适用于类,您不能真正根据函数名称之一自动加载随机 php 文件。

    您最好的选择是使用 OOP 并为您的助手使用课程。只有在需要时,您才能获得自动加载文件的效率,并且您将更接近 Laravel 社区的其他成员所做的事情。

    但是如果你仍然想使用普通的旧的非对象 php 函数,我想你可以简单地从 start.php 中单独 require() 所有这些函数,但它们都会在每个页面请求上加载。

    【讨论】:

    • 好的,我决定采用 OOP 方法。我确实知道这样会更好,但是一些最终用户会感到很困惑——我真的只是想让他们的事情变得更容易一些。因此,结合您的建议,我正在扩展模板引擎,以便为我的最终用户提供更多功能。