Composer 自动加载几个路径作为一个命名空间

Posted

技术标签:

【中文标题】Composer 自动加载几个路径作为一个命名空间【英文标题】:Composer autoload few paths as one namespace 【发布时间】:2015-10-25 18:41:17 【问题描述】:

我有这个文件夹结构:

core/
core/db/
core/db/beans

我在core/db/core/db/beans 中有namespace AAA\Core\DataBase; 的课程。

在我的 composer.json 文件中,我有:

"autoload": 
        "psr-4": 
            "AAA\\Core\\": "core/",
            "AAA\\Core\\DataBase\\": "core/db/"
        
    

之后,我可以将core/ 文件夹中的类与use AAA\Core\DataBase\ClassName; 一起使用,但不能使用core/db/beans 中的类。我收到“致命错误:找不到类”。如何将几个文件夹添加到同一个命名空间?有可能吗?

【问题讨论】:

【参考方案1】:

按照 PSR-4 标准:

加载与完全限定类名对应的文件时

    一个或多个前导命名空间和子命名空间名称的连续系列,不包括前导命名空间分隔符,在完全限定的类名(“命名空间前缀”)中对应于至少一个“基目录”。李> “命名空间前缀”之后的连续子命名空间名称对应于“基本目录”中的子目录,其中命名空间分隔符表示目录分隔符。子目录名称必须与子命名空间名称的大小写匹配。

因此,您的命名空间必须与您的文件夹结构相对应。

PSR-4 Standard

【讨论】:

那么,我不能将几个具有相同命名空间的类放到不同的文件夹中? 是的,您不能这样做,因为它违反了您用于自动装载机的 psr-4 标准。但是您总是可以编写自己的自动加载器,并将其与由 composer 生成的自动加载器一起注册。虽然我建议不要这样做,但手动自动加载可能会严重降低您的系统速度。 如果我正确阅读了 OP,问题是“我可以为单个命名空间定义多个根目录吗?”答案是“是的,你可以”。 Here is a more recent question with the correct solution。我意识到这个答案已经有 6 年历史了,所以当时这可能是不可能的......只是发表评论让未来的访问者知道这是可能的。

以上是关于Composer 自动加载几个路径作为一个命名空间的主要内容,如果未能解决你的问题,请参考以下文章

使用子命名空间自动加载我的类 (Composer.json)

使用命名空间自动加载 Composer 和 PSR-0 类

thinkphp5.0自动加载

具有相同命名空间的不同 Composer 包

作曲家自动加载器 psr-0 命名空间

ZF2:自动加载没有命名空间的库