"A non-empty PSR-4 prefix must end with a namespace separator"

"A non-empty PSR-4 prefix must end with a namespace separator"

我正在构建具有以下结构的应用程序:

├── README.md
├── composer.json
├── index.php
└── src
    └── test.php

...我的 composer.json 文件如下所示:

{
    "minimum-stability" : "alpha",
    "name" : "patrick/changedetection",
    "description" : "A change detection script for observing additions to web pages",
    "license" : "MIT",
    "autoload" : {
        "psr-4" : {
            "patrick\changedetection\" : [
                "src/"
            ]
        }
    }
}

但是当我 运行 composer install 时,我得到

[InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator.

我需要做什么才能正确地自动加载我的 test.php 文件?

===

编辑:这是使用 Composer 版本 1.8.4。

我觉得你的方括号比你需要的多了一个...试着把它们去掉它会像:

{
    "minimum-stability" : "alpha",
    "name" : "patrick/changedetection",
    "description" : "A change detection script for observing additions to web pages",
    "license" : "MIT",
    "autoload" : {
         "psr-4" : {
              "patrick\changedetection\" : "src/"
         }
     }
}

如果您需要在单个位置搜索前缀,则无需添加。

文档:

https://getcomposer.org/doc/04-schema.md#psr-4 这就是为什么您的解决方案是

{
    "minimum-stability" : "alpha",
    "name" : "patrick/changedetection",
    "description" : "A change detection script for observing additions to web pages",
    "license" : "MIT",
    "autoload" : {
         "psr-4" : {
              "patrick\changedetection\" : "src/"
         }
     }
}

如果您需要在多个目录中搜索相同的前缀,您可以将它们指定为一个数组:

{
    "autoload": {
        "psr-4": { "Monolog\": ["src/", "lib/"] }
    }
}

因为我遇到了同样的问题,我在作曲家的网站上找到了我的解决方案,我把它贴在这里:

在 psr-4 键下,您定义了一个从名称空间到路径的映射,相对于包根目录。当自动加载一个像 Foo\Bar\Baz 这样的 class 时,命名空间前缀 Foo\ 指向目录 src/ 意味着自动加载器将查找名为 src/Bar/Baz.php 的文件,如果当前的。请注意,与旧的 PSR-0 样式相反,文件路径中不存在前缀 (Foo\)。

命名空间前缀必须以 \ 结尾,以避免相似前缀之间的冲突。例如,Foo 将匹配 FooBar 命名空间中的 classes,因此尾部反斜杠解决了问题:Foo\ 和 FooBar\ 是不同的。

在 install/update 期间,PSR-4 引用全部组合成一个键 => 值数组,可以在生成的文件 vendor/composer/autoload_psr4.php.

示例:

{
"autoload": {
    "psr-4": {
        "Monolog\": "src/",
        "Vendor\Namespace\": ""
    }
}
}

如果您需要在多个目录中搜索相同的前缀,您可以将它们指定为一个数组:

{
"autoload": {
    "psr-4": { "Monolog\": ["src/", "lib/"] }
}
}

如果你想要一个后备目录,可以在其中查找任何命名空间,你可以使用空前缀,例如:

{
"autoload": {
    "psr-4": { "": "src/" }
}
}

Composer psr-4 Doc