PHP composer自动加载未能加载类

5

我刚开始使用Composer进行依赖管理,但是我很难弄清楚我没有遵循PSR-4自动加载标准的原因,所以我需要一些建议。我有一个生成随机值的类,已经在Packagist上了。项目结构如下(我将composer.json文件标记为A和B):

项目目录

  |classfile.php 
A |composer.json
  |vendor
   |autoload.php
    |ejfrancis
      |php-random-value
B       |composer.json
        |RandomValue.php        <--the class I want autoloaded    

composer.json A

{
    "require": {
        "ejfrancis/php-random-value": "dev-master"
    }
}

composer.json B

{
    "name": "ejfrancis/php-random-value",
    "description": "Secure random value generator.",
    "require": {
        "php": ">=5.3.0"        
    },
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "ejfrancis\\" : ""
        }
    }
}

最后是RandomValue.php文件,它声明了ejfrancis命名空间。

namespace ejfrancis;

class RandomValue{
  //foo
}

当我运行应用程序时,出现错误“找不到RandomValue类”,因此它无法正确自动加载。我是否没有遵守PSR-4规范,或者有其他错误?我还尝试使用类似于“classmap”:[“RandomValue.php”]的composer classmap自动加载,但没有成功。 感谢您的帮助。
更新:我在composer.json B文件上运行了“composer validate”,它绝对是有效的。

1
创建导致您提到的错误的代码是什么样子的?在我看来,您很可能错过了正确的命名空间,其他方面看起来都不错。 - Sven
看起来你是正确的!代码是'$randomValue = new RandomValue',我在使用它的类文件顶部添加了'use ejfrancis\RandomValue as RandomValue',现在它可以工作了。如果你把这个作为完整的答案而不是评论添加,我会标记它为正确的。 - ejfrancis
2个回答

16
将您的composer中的命名空间更改为"Namespace\\"并执行composer dump-autoload -o

我在composer.json B中将autoload psr-4属性更改为"ejfrancis\": "",并运行'composer dump-autoload -o',但仍然显示类未找到。 - ejfrancis
1
我也在 composer.json B 上运行了 'composer validate',它绝对是有效的。你关于尾随 '\' 的说法是正确的。 - ejfrancis
感谢 @ejfrancis 提供的 composer 命令,它帮助我发现我的 composer 文件格式不正确。 - Uriahs Victor
这个程序虽然我找得有点晚,但它还是挽救了我的一天。 - Majd

2

最近我也遇到了类似的问题,经过一小时的挣扎,我发现我没有在项目初始文件中使用require_once 'vendor/autoload.php;

我只是为那些像我一样忘记这个部分的人发送了这个答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接