运行作曲家更新后,我不断出现以下错误:
警告:类解析不明确, "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
知道如何解决这个问题吗?谢谢
[购物软件5 - PHP 7.0]
这是购物软件的正常行为。
Doctrine 库经常使用 final class
语句,为了使其与 Shopware 属性系统配合使用,这些类通过作曲家自动加载进行了替换。您可以在shopware/engine/Library/Doctrine/Common
中找到更改的文件
仅供参考:这就是为什么 Shopware 仅在优化作曲家自动加载时才起作用的原因。
作曲家转储自动加载 --优化
否则,您会遇到来自无效或错误实体的随机错误。
要摆脱这些警告,您应该将具有不明确类的文件添加到composer.json
中exclude-from-classmap
:
"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/"
}
},
如果你要求somevendorsomepackagedbEntity
类,作曲家会先搜索overrides/somevendor/somepackage/db/Entity.php
,只有当找不到时,它才会尝试vendor/somevendor/somepackage/db/Entity.php
。这是因为somevendorsomepackagedb
命名空间的定义比somevendorsomepackage
更精确。
因此,如果要以这种方式覆盖第三方类,则应定义比第三方库更精确的命名空间。