我有以下项目结构:
- root
|- src <- Application specifc source
|- [...]
|- tests
|- [...]
|- Vendor
|- myusername <- shared packages for all projects
|- src
|- MyNamespace
|- File.php
|- autoload.php
|- test.php
|- composer.json
composer.json
已有PSR-4条目:
"autoload": {
"psr-4": {
"MyNamespace\\":"myusername/src"
}
}
/Vendor/test.php
<?php
require 'autoload.php';
$file = new MyNamespace\File();
echo $file->isDone();
Vendor/myusername/src/MyNamespace/File.php
<?php
namespace MyNamespace;
class File
{
public function isDone()
{
return 'Done!';
}
}
但我总是致命的错误Fatal error: Class 'MyNamespace\File' not found in [...]
作曲家设置或文件结构是否正确?我能做什么?
编辑1:
我可以很好地加载外部供应商
答案 0 :(得分:15)
您的代码有两个问题。
您使用的是PSR-4错误。
他们不再需要在您的文件夹中嵌入命名空间,从而在项目文件夹中创建更清晰的空间。
PSR-0
vendor/<VendorName>/<ProjectName>/src/<NamespaceVendor>/<NamespaceProject>/File.php
PSR-4 (See that they removed the namespaces folders? Because you already reference that in composer.json
vendor/<VendorName>/<ProjectName>/src/File.php
所以在你的情况下,它将是:
Vendor/myusername/src/File.php
您的composer.json无效
"MyNamespace\\":"myusername/src"
不包含项目代码所在目录的完整路径。它应该是这样的:
"autoload": {
"psr-4": {
"MyNamespace\\": "Vendor/myusername/src"
}
}
但是存储文件的最佳方式是在vendor
目录之外,因为自动下载的库使用它,而是选择不同的&#34;开发&#34;目录:
"autoload": {
"psr-4": {
"MyUsername\\MyProject\\": "src/myusername/myproject/src"
}
}
感谢Sven的评论。