问题 具有PSR-4自动加载功能的Composer:来自命名空间的类未加载


我有以下项目结构:

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

我可以加载外部供应商


4475
2018-04-03 14:12


起源

您是否尝试将您的目录与Vendor之外的源一起放置?我通常有项目结构,如sth / src / MyNamespace / ...和sth / Vendor / ...... - mareckmareck
这是我所有项目的共享供应商,而不是项目源,因此,它位于Vendor目录中。 - Gabriel Santos
@mareckmareck我已经更新了项目结构以避免混淆。 - Gabriel Santos


答案:


您的代码有两个问题。

您使用的是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 目录,因为自动下载的库使用它,而是选择一个不同的“开发”目录:

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

感谢Sven的评论。


15
2018-04-03 14:39



嘿!我与PSR-0和4混淆了,我的命名空间错了:c - Gabriel Santos
在回复之前几秒钟,我已经解决了正确构建项目的问题,并验证了编写器将从根目录而不是供应商目录中查找文件。一切都很好(: - Gabriel Santos
永远不要在主要中定义自动加载 composer.json 有一条进入的道路 vendor。假设Composer将管理软件包,那么特定软件包的任务就是为自己声明自动加载。那将是一个不同的根路径,没有任何 vendor/myusername/myproject 字首。 - Sven
谢谢,请记住这一点 - Coded Monkey