【问题标题】:Composer, PSR-4 Autoloading IterationComposer,PSR-4 自动加载迭代
【发布时间】:2014-08-12 19:02:19
【问题描述】:

我目前正在运行 Slim 和 Twig,我的文件夹结构如下

/application/modules

在我的 composer.json 我有

"autoload": {
    "psr-4": {
        "Application\\":        "application/modules/",
        "Core\\":               "application/",
        "Middleware\\":         "application/slim/middleware/"
    }
}

我的问题是Application\modules\ 中每个模块都有一个目录。现在我的问题是,使用 PSR-4 自动加载时是否可以让 composer 遍历子目录?

【问题讨论】:

  • 我认为 PSR-4 需要明确声明。
  • 我想了很多,但我希望有办法做到这一点
  • 我会看这个问题,因为我也很感兴趣。我以前遇到过这个问题,但我从来没有找到解决方法。
  • 一旦定义了命名空间前缀,每个子目录将与其他命名空间一一对应以区分大小写的方式。所以Application\foo\Bar 将查看application/modules/foo/Bar.php。我经常被这个绊倒,所以我决定最终通过writing it down! 将它记住

标签: php composer-php autoload slim


【解决方案1】:

我发现您的 PSR-4 声明存在问题。

您不应将“核心”类放在包含其他命名空间的子文件夹的文件夹中。

Composer 中的 PSR-4 自动加载是这样工作的:如果要加载的类的完全限定类名与任何 PSR-4 定义中声明的前缀匹配,则前缀中提到的前缀将从类名中删除, 剩下的类名被映射到一个文件名并被搜索。

如果您在文件夹application/modules 中有名为Application\ 的类,并且在文件夹application 中有名为Core\ 的类,那么从技术上讲,Composer 可能会找到与类名称(如Core\modules\Whatever)匹配的文件,尽管这些文件将包含一个 Application\Whatever 类。

我建议将所有 Core 类移动到它们自己的文件夹中,并在 PSR-4 声明中指向它。

您最初的问题的问题是您忽略了一个重要信息:您的模块的类和文件结构是什么?

Composer 的自动加载器将愉快地解析以命名空间前缀 Application 开头的任何类,从类名中删除该前缀,将剩余部分转换为路径名并在 application/modules/ 中搜索该文件。假设您有一个模块类Application\MyModule\Foobar,它将在application/modules/MyModule/Foobar.php 中搜索。为什么?因为前缀Application 将被删除以允许在 PSR-4 中使用更短的路径名。 (使用 PSR-0 意味着您必须为类名中的每一级命名空间都有一个文件夹。)

请注意,为了获得最佳性能,建议使命名空间的前缀尽可能长,因为 Composer 允许为任何给定前缀拥有多个目录,但随后必须在多个目录中搜索正确的文件.搜索文件很费时间!

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2015-04-20
    • 2018-07-25
    • 1970-01-01
    • 2014-11-01
    • 2014-03-24
    • 2018-06-01
    • 2017-02-01
    • 2017-09-15
    相关资源
    最近更新 更多