具有 PSR-4 自动加载功能的编辑器:未加载命名空间中的类


Composer with PSR-4 autoloading: classes from namespace not loading

>我有以下项目结构:

- 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:

我可以很好地加载外部供应商

你的代码有 2 个问题。

您使用 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

您的作曲家.json 无效

         "MyNamespace''":"myusername/src"

不包含包含项目代码的目录的完整路径。它应该是这样的:

"autoload": {
     "psr-4": {
         "MyNamespace''": "Vendor/myusername/src"
     }
}

但是存储文件的最佳方式是在 vendor 目录之外,因为自动下载的库使用它,而是选择不同的"开发"目录:

"autoload": {
     "psr-4": {
         "MyUsername''MyProject''": "src/myusername/myproject/src"
     }
}

感谢评论中的斯文。