【发布时间】:2018-07-25 08:53:04
【问题描述】:
我有一个目录来保存所有“帮助”类和函数。我们将目录称为 helpers。
我想将 PSR-4 后备目录配置为指向这个 helpers 目录:
"autoload": {
"psr-4": {
"": "helpers/"
}
}
来自 Composer 文档:
... 将在其中查找任何命名空间的后备目录。
所以我的理解是,如果我在该目录中的文件/类具有符合 PSR-4 的名称,我的应用程序应该能够在那里找到它们。
现在我创建了一个文件 helpers/Logger.php,其类为 Logger
为了 1) 符合 PSR-4 和 2) 正常工作,该类应该使用什么命名空间?
我试过了
namespace Logger;
并将类加载为
$logger = new Logger();
但我收到错误找不到类记录器
深入研究 composer 代码(loadClass() 方法)告诉我它确实找到并包含文件 helpers/Logger.php,但由于某种原因仍然找不到该类。 p>
根据 PSR-4 命名空间应该是这样的:
namespace Helpers;
类应该这样调用:
$logger = new Helpers\Logger();
我有 Class Helpers\Logger not found,但另外文件 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;
}
}
所以它实际上会尝试将文件名与完全限定的类名进行匹配。
所以我对 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');
【问题讨论】:
-
我不得不问,因为每个人都忘记了。您还记得要求您的自动加载文件吗?
-
是的,我做到了:
require_once __DIR__ . '/vendor/autoload.php';但是让我也编辑我的问题以避免混淆。
标签: php namespaces composer-php psr-4