“非空的PSR-4前缀必须以名称空间分隔符结尾”

时间:2019-02-16 15:10:55

标签: php composer-php autoload

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

├── 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]非空的PSR-4前缀必须以结尾   命名空间分隔符。

要正确自动加载test.php文件,我需要做什么?

===

编辑:这是使用Composer 1.8.4版。

3 个答案:

答案 0 :(得分:1)

我认为您的方括号超出了您的需要...尝试将其删除,就像这样:

{
    "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/"
         }
     }
}

答案 1 :(得分:1)

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

文档:

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/"] }
    }
}

答案 2 :(得分:0)

由于我有同样的问题,我在作曲家的网站上找到了解决方案,然后将其粘贴在这里:

在psr-4键下,定义相对于程序包根目录的从名称空间到路径的映射。当自动加载诸如Foo \ Bar \ Baz之类的类时,名称空间前缀Foo \指向目录src /意味着自动加载器将查找名为src / Bar / Baz.php的文件,如果存在,则将其包括在内。请注意,与较早的PSR-0样式相反,文件路径中不存在前缀(Foo \)。

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

在安装/更新期间,所有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