Composer 自动加载检查是否已加载 类

Composer autload check for already loaded classes

我在我的项目中为 php 使用 Composer 依赖管理器。我正在构建我的项目以关闭名为 Concrete5 的开源 CMS。他们还使用 Composer 加载内容。

Concrete5 和我自己的使用 Doctrine 的包,Doctrine 包含在两个 composer.json 文件中。在两个不同的位置加载 Doctrine 时自动加载有问题吗?

Composer 和大多数其他自动加载器使用标准 PHP spl_register_autoload() 函数来跟踪自动加载堆栈。这与 PSR-0 和 PSR-4 的规则相结合,允许每个注册的自动加载器都有机会实现代码的依赖关系。

因此,当您有两个可以满足相同依赖关系的自动加载器时,首先有机会响应的自动加载器获胜。为了解决这个问题,spl_register_autoload 提供了一种将自动加载器添加到堆栈的方法,以便它们首先 运行。对于 composer 这实际上是默认发生的,禁用它以便您可以加载依赖项的核心版本的方法是 set prepend-autoloader to false in your package's composer.json

{
    "prepend-autoloader": false
}

另一种选择完全是定义 provide in your packages composer.json with proper versions for the dependencies that the core provides (you can find this in concrete/composer.lock).

{
    "provide": {
        "doctrine/dbal": "v2.5.1",
        "doctrine/orm": "v2.4.8"
    }
}

这将防止 composer 提取依赖项的重复版本,这样做的缺点是您需要在核心更新其依赖项时手动更新此列表。