2

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

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

4

1 回答 1

1

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

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

{
    "prepend-autoloader": false
}

另一个完全的选择是provide在你的包composer.json中为核心提供的依赖项定义正确的版本(你可以在 中找到它concrete/composer.lock)。

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

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

于 2015-12-27T19:11:14.153 回答