一个非空的PSR-4前缀必须以命名空间分隔符结尾。

107

我正在尝试使用Composer设置PSR-4,但是我一直在收到错误提示A non-empty PSR-4 prefix must end with a namespace separator.

我的composer.json中的autoload如下:

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models"
    }
},

app/models是空的。

我做错了什么?我该如何解决?

3个回答

216

有人发表了评论但后来删除了。他提到我在Acme\\models的结尾处缺少\\。使用Acme\\models\\将消除该消息并使其正常工作。


7
是的,PSR-4要求使用尾部斜杠(需要双斜杠,因为它需要转义)。 - Connor Tumbleson
3
我必须说,这不仅是一个愚蠢的要求,规范也非常清楚地说明了这一点。这就是我为什么会因为一个非常基本的问题而出现在这里的原因。 - aross
23
使用这个答案后,我还发现composer validate也能很好地指出问题所在。 - dave
使用存储库类型路径、相对路径或符号链接时,此操作会导致问题,因为它似乎会在此操作后尝试重新创建符号链接,并具有过时或缓存的composer.json。 - FantomX1
我已经尝试了这个方法,但仍然遇到了相同的错误,我应该删除供应商或清除一些缓存吗? - shamaseen
对于任何使用符号链接的人,您应该在再次尝试之前删除符号链接的文件夹。 - shamaseen

12

正如其他人所说,PSR-4需要末尾斜杠

虽然我在Windows中不得不将/转换为\\(在Linux上应该可以正常工作):

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },

0

非空的 PSR-4 前缀必须以命名空间分隔符结尾。 命名空间分隔符是 \\

  • 方法一

不正确 ⬇️⬇️⬇️

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models"
    }
},

正确 ⬇️⬇️⬇️

"autoload": {
    "psr-4": {
        "Acme\\models" : "app/models/"
    }
},
  • 方法二:如果这不起作用,请尝试删除 vendor + composer.lock 并重新安装依赖项。
  • 方法三:在 libraries 文件夹中删除 autoload_psr4.php 文件 - 它可能是在更新之前创建的,并且之前存在问题。

了解更多关于 PSR-4:自动加载器的信息


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