Проверка автозагрузки Composer для уже загруженных классов

Я использую менеджер зависимостей Composer для php в своем проекте. Я строю свой проект на CMS с открытым исходным кодом под названием Concrete5. Они также загружают материалы с помощью Composer.

Concrete5 и мой собственный пакет, использующий Doctrine и Doctrine, включены в оба файла composer.json. Есть ли у меня проблемы с автозагрузкой при загрузке Doctrine в двух разных местах?


person user257980    schedule 27.12.2015    source источник


Ответы (1)


Composer и большинство других автозагрузчиков используют стандартную функцию PHP spl_register_autoload(). отслеживать стек автозагрузки. Это в сочетании с правилами PSR-0 и PSR-4 позволяет каждому зарегистрированному автозагрузчику выполнить зависимость для вашего кода.

Таким образом, когда у вас есть два автозагрузчика, которые могут выполнять одну и ту же зависимость, выигрывает тот из них, который получит шанс ответить первым. Чтобы помочь в этом, spl_register_autoload предоставляет способ добавления автозагрузчиков в стек, чтобы они запускались первыми. С композитором это фактически происходит по умолчанию, способ отключить его, чтобы вы могли загружать основные версии зависимости, — это установите prepend-autoloader на false в composer.json вашего пакета.

{
    "prepend-autoloader": false
}

Другой вариант — полностью определить provide в ваших пакетах composer.json с правильными версиями для зависимостей. которые предоставляет ядро ​​(вы можете найти это в concrete/composer.lock ).

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

Это не позволит композитору удалять дубликаты версий зависимостей, недостатком этого является то, что вам нужно будет поддерживать этот список в актуальном состоянии вручную, когда ядро ​​​​обновляет свои зависимости.

person Korvin Szanto    schedule 27.12.2015