Composer自动加载检查已加载的类

时间:2015-12-27 18:43:42

标签: composer-php concrete5 concrete5-5.7

我在我的项目中使用了用于php的Composer依赖项管理器。我将我的项目建立在名为Concrete5的开源CMS上。他们也在使用Composer加载东西。

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

1 个答案:

答案 0 :(得分:1)

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
}

完全另一个选择是在软件包composer.json中定义provide,并为核心提供的依赖项提供适当的版本(可以在concrete/composer.lock中找到)。

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

这将阻止编写器删除重复版本的依赖项,其缺点是当核心更新其依赖项时,您需要手动保持此列表最新。