如何正确使用composer psr-4 fallback

Mak*_*nar 7 php namespaces composer-php psr-4

我有一个目录,将保留所有"帮助"类和函数.我们调用目录助手.

我想配置PSR-4回退目录以指向此帮助程序目录:

    "autoload": {
          "psr-4": {
                "": "helpers/"
           }
     }
Run Code Online (Sandbox Code Playgroud)

从Composer文档:

...将在其中查找任何命名空间的后备目录.

所以我的理解是,如果我的目录中的文件/类具有PSR-4兼容名称,我的应用程序应该能够在那里找到它们.

现在我用类Logger创建了一个文件helpers/Logger.php

这个类的名称空间应该是什么,以便1)符合PSR-4和2)只是工作?

我试过了

namespace Logger;
Run Code Online (Sandbox Code Playgroud)

并加载类为

$logger = new Logger();
Run Code Online (Sandbox Code Playgroud)

但我收到错误类记录器未找到

深入研究作曲家代码(loadClass()方法)向我展示它实际上找到并包含文件helpers/Logger.php,但由于某种原因仍无法找到该类.

根据PSR-4命名空间应该是这样的:

namespace Helpers;
Run Code Online (Sandbox Code Playgroud)

类应该像这样调用:

$logger = new Helpers\Logger();
Run Code Online (Sandbox Code Playgroud)

找不到Class Helpers\Logger,但另外还没有包含文件helpers/Logger.php.

Composer的loadClass()方法中的回退逻辑如下:

    // PSR-4 lookup
    $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

   ........

    // PSR-4 fallback dirs
    foreach ($this->fallbackDirsPsr4 as $dir) {
        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
            return $file;
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以它实际上试图将文件名与完全限定的类名匹配.

所以我似乎在理解PSR-4时遗漏了一些东西.

但到底是什么?

编辑

要检查所有内容,我从项目根目录运行一个简单文件,所有其他通过composer配置的库都正确加载(例如,Pimple工作正常):

<?php

require_once __DIR__ . '/vendor/autoload.php';
$app = new \Pimple\Container();

/** Register logger */
$app['logger'] = function ($c) {
    return new Helpers\Logger();
};

$app['logger']->info('test');
Run Code Online (Sandbox Code Playgroud)

rob*_*006 3

此后备用作全局命名空间的目录定义。所以是的,它可以用于自动加载任何命名空间中的任何类,但您仍然需要遵循它们的 PSR-4 规则。目录结构应该代表命名空间结构。如果你有这样的规则:

"autoload": {
      "psr-4": {
            "": "helpers/"
       }
 }
Run Code Online (Sandbox Code Playgroud)

你的Helpers\Logger类应该在 中helpers/Helpers/Logger.php,因为这样 Composer 就会根据自动加载规则解析类文件路径。

helpers/Helpers/Logger.php
   ^       ^      ^
   |       |      |
   |       |    Class name part
   |       |            
   |     Namespace part
   |
 Static prefix for global namespace
Run Code Online (Sandbox Code Playgroud)