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)
此后备用作全局命名空间的目录定义。所以是的,它可以用于自动加载任何命名空间中的任何类,但您仍然需要遵循它们的 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)
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |