Предупреждение: Доктрина неоднозначного разрешения классов

После запуска обновления композитора у меня все еще возникает ошибка ниже:

Предупреждение: неоднозначное разрешение класса, «Doctrine \ ORM \ Persisters \ Entity \ BasicEntityPersister» было обнаружено в обоих «$ baseDir. '/Engine/Library/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php» и «/ var / www / html / shop5 / vendor / doctrine / orm / lib / Doctrine / ORM / Persisters / Entity / BasicEntityPersister.php ", будет использоваться первый. Предупреждение: неоднозначное разрешение класса, «Doctrine \ Common \ Proxy \ AbstractProxyFactory» было обнаружено в обоих «$ baseDir. '/Engine/Library/Doctrine/Common/Proxy/AbstractProxyFactory.php» и «/ var / www / html / shop5 / vendor / doctrine / common / lib / Doctrine / Common / Proxy / AbstractProxyFactory.php ", будет использоваться первый.

Я пытался запустить следующие команды, но ни одна из них не работает:

composer dump-autoload -o
composer clearcache

Есть идеи, как исправить эту проблему? Спасибо

[shopware5 - php7.0]


person Sirius    schedule 09.01.2018    source источник
comment
Похоже, у вас есть библиотека Doctrine, установленная в нескольких местах, какое из них вы используете? Попробуйте удалить место, которое вы не используете.   -  person Nando    schedule 10.01.2018


Ответы (2)


Это нормальное поведение Shopware.

Библиотека Doctrine довольно часто использует оператор final class, чтобы заставить его работать с Система атрибутов Shopware классы были заменены через автозагрузку композитора. Вы можете найти измененные файлы в shopware/engine/Library/Doctrine/Common

К вашему сведению: это причина, по которой Shopware работает только тогда, когда автозагрузка композитора оптимизирована.

композитор дамп-автозагрузка --optimize

В противном случае вы столкнетесь со случайными ошибками из-за недопустимых или неправильных объектов.

person FloydThreepwood    schedule 12.01.2018
comment
Это действительно плохо. У последнего ключевого слова есть свое предназначение, понимаете? - person mblaettermann; 17.04.2018
comment
@mblaettermann Это означает, что вы не можете его продлить, поэтому мы заменили его. В Java это влияет на производительность, но в PHP это просто сообщение контракта. Я не понимаю, как это может быть хорошо или плохо ... Это просто очевидно необходимо. - person FloydThreepwood; 20.04.2018
comment
@FloydThreepwood Дело в том, что этот файл настолько важен, что его ЗАПРЕЩАЕТСЯ расширять или, что еще хуже, заменять. Пожалуйста, не спорьте по поводу этих фактов. То, что вы сделали, НЕПРАВИЛЬНО, и реального решения не видно. Ваш ответ меня оскорбляет. - person mblaettermann; 24.04.2018
comment
: D Это гораздо веселее, чем я ожидал. Конечно, я буду спорить по поводу этих фактов. Приложение не является рабом фреймворков, которые оно включает, но использует фреймворки в собственных интересах. Это, конечно, не означает, что мы должны получить здесь бесплатный пропуск, но также не означает, что такая возможность строго запрещена. - person FloydThreepwood; 25.04.2018

Чтобы избавиться от этого предупреждения, вам следует добавить файлы с неоднозначными классами в exclude-from-classmap в вашем composer.json:

"autoload": {
    ...
    "exclude-from-classmap": [
        ...
        "vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php",
        "vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php"
    ]
},

Тогда dump-autoload проигнорирует эти файлы.


По этой причине Shopware работает только тогда, когда автозагрузка композитора оптимизирована.

Я не исследовал, как это делается в Shopware, но это тоже можно исправить / улучшить. Для композитора более точные определения пространств имен имеют приоритет. Итак, если у вас есть это в вашей автозагрузке:

"autoload": {
    "psr-0": { 
        "somevendor\\somepackage\\": "vendor/somevendor/somepackage/",
        "somevendor\\somepackage\\db\\": "overrides/somevendor/somepackage/db/"
    }
},

И если вы запросите класс somevendor\somepackage\db\Entity, композитор сначала выполнит поиск в overrides/somevendor/somepackage/db/Entity.php, и только если он не сможет его найти, он попытается vendor/somevendor/somepackage/db/Entity.php. Это потому, что определение для пространства имен somevendor\somepackage\db более точное, чем для somevendor\somepackage.

Поэтому, если вы хотите таким образом переопределить сторонние классы, вам следует определить более точные пространства имен, чем это делают сторонние библиотеки.

person rob006    schedule 25.04.2018
comment
Интересный. Спасибо, что поделились этими знаниями. Я поиграю с магазином composer.json и посмотрю, можно ли решить эту проблему, по крайней мере, избавьтесь от предупреждения. Правильным исправлением будет исправление системы атрибутов программного обеспечения. Там было гораздо больше работы и устаревших БК. - person mblaettermann; 25.04.2018