警告:模糊的类解析Doctrine

时间:2018-01-09 17:04:10

标签: symfony doctrine-orm composer-php shopware

运行作曲家更新后,我一直有以下错误:

  

警告:类别分辨率模糊,   发现了“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]

2 个答案:

答案 0 :(得分:3)

这是Shopware的正常行为

Doctrine库经常使用final class语句,为了使它与Shopware attribute system一起工作,这些类被作曲家自动加载所取代。您可以在shopware/engine/Library/Doctrine/Common

中找到已更改的文件

仅供参考:这就是Shopware仅在优化了编辑器自动加载时才能工作的原因。

  

composer dump-autoload --optimize

其他你会遇到无效或错误实体的随机错误。

答案 1 :(得分:1)

要摆脱这些警告,您应该在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" ] }, 中将含有不明确类别的文件添加到exclude-from-classmap

dump-autoload

然后"autoload": { "psr-0": { "somevendor\\somepackage\\": "vendor/somevendor/somepackage/", "somevendor\\somepackage\\db\\": "overrides/somevendor/somepackage/db/" } }, 会忽略这些文件。

  

这就是Shopware仅在优化了编辑器自动加载时才能工作的原因。

我没有调查在Shopware中如何做到这一点,但这也可以修复/改进。对于作曲家,名称空间的更精确定义具有优先权。所以如果你在自动加载中有这个:

somevendor\somepackage\db\Entity

如果您要求overrides/somevendor/somepackage/db/Entity.php课程,作曲家将首先在vendor/somevendor/somepackage/db/Entity.php中进行搜索,并且只有在找不到它时,才会尝试somevendor\somepackage\db。这是因为somevendor\somepackage命名空间的定义比Vigenère cipher in pure bash #!/usr/local/bin/bash # vigenere.sh # http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher a="ABCDEFGHIJKLMNOPQRSTUVWXYZ" [[ "${*/-d/}" != "" ]] && echo "Usage: $0 [-d]" && exit 1 m=${1:+-} printf "string: ";read t printf "keyphrase: ";read -s k printf "\n" for ((i=0;i<${#t};i++)); do p1=${a%%${t:$i:1}*} p2=${a%%${k:$((i%${#k})):1}*} d="${d}${a:$(((${#p1}${m:-+}${#p2})%${#a})):1}" done echo "$d" 更精确。

因此,如果您想以这种方式覆盖第三方类,则应该定义比第三方库更精确的名称空间。