ZF2中targetEntity =“Y”的类重新声明错误

时间:2012-11-15 10:41:07

标签: doctrine-orm zend-framework2 autoload

我目前在代码库中遇到了一个奇怪的错误。您可以在my github right here上看到完整的ZF2s项目代码。 < - 有一个链接

我正在设置一个带有两个实体(X和Y)的模块。 Entity_X包含对Entity_Y via(targetEntity =“Entity_Y”)的引用。错误持续存在于FQCN或仅存在CN本身。

Entity_X:
  id int PK,
  id_Y int FK,
  text varchar

Entity_Y:
  id int PK,
  text varchar

首先加载Entity_Y然后加载Entity_X一切正常。对于StandardAutoloader和ClassMapAutoloader,这仍然适用。 然而:当首先加载Entity_X并且ClassMapAutoloader存在时,我将看到以下错误:

Fatal error: Cannot redeclare class Kennzahlen\Entity\Referenzwert (Entity_Y)
in \module\Kennzahlen\src\Kennzahlen\Entity\Referenzwert.php 
on line 13

首先使用StandardAutoloader加载Entity_X也没有任何问题。

更新

问题似乎在ZF2s ClassMapAutoloader(或一般的自动加载机制)中。我的模块使用了ClassMapAutoloader并使用了这个我得到了上面提到的错误。当删除ClassMapAutoloader并简单地使用StandardAutoloader时,错误就消失了。感谢@ocramius和所有其他人,我对此感到厌烦:)

2 个答案:

答案 0 :(得分:4)

我正在编写一个失败的测试用例,试图在doctrine/common中解决这个问题。问题似乎是静默自动加载器(由@Xerkus解释)与doctrine / common本身不兼容。要解决此问题,请使用来自ZF2(或来自作曲家)的StandardAutoloader,而不要使用ClassMapAutoloader。这将解决问题,直到补丁准备就绪。

更新:正在doctrine/common#216

建议修补程序

答案 1 :(得分:2)

我不了解学说,但我浏览了源代码,我认为我发现了问题:
https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/ClassLoader.php#L224
在这里,这段代码期望自动加载器将返回值评估为true,但这不是spl自动加载机制的要求,因此自动加载器可以返回NULL,

要检查我是否正确,请在您的项目中更新Doctrine/Common/ClassLoader.php

中的第224行
} else if ($loader[0]->{$loader[1]}($className)) {

} else if ($loader[0]->{$loader[1]}($className) && class_exists($className, false)) {

Ans看看问题是否已修复,如果我是正确的 - 然后将bug报告给学说项目