1

現在、コードベース内で奇妙なエラーに直面しています。完全なZF2sプロジェクトコードは、私のgithubのここにあります。<-リンクがあります

2つのエンティティ(XとY)でモジュールを設定しています。Entity_Xには、(targetEntity = "Entity_Y")を介した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の両方に当てはまります。ただし、ClassMapAutoloaderが存在する状態で最初にEntity_Xをロードすると、次のエラーが表示されます。

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

StandardAutoloaderを使用して最初にEntity_Xをロードしても、問題なく機能します。

アップデート

問題は、ZF2のClassMapAutoloader(またはAutoloading-Mechanism一般)内にあるようです。私のモジュールはClassMapAutoloaderを使用しましたが、これを使用すると上記のエラーが発生しました。ClassMapAutoloaderを削除し、単にStandardAutoloaderを使用すると、エラーは空中に消えました。@ocramiusと他のすべての人に感謝します:)

4

2 に答える 2

4

私はこれを教義/共通で解決しようとする失敗したテストケースを書いています。問題は、サイレントオートローダー(@Xerkusで説明されている)がdoctrine/common自体と互換性がないことであるようです。これを解決するには、を使用するStandardAutoloader代わりに、ZF2(またはcomposer)からを使用しClassMapAutoloaderます。これにより、パッチの準備ができるまで問題が解決します。

更新:パッチはdoctrine / common#216で提案されています

于 2012-11-15T14:12:28.063 に答える
2

私はドクトリンの知識はありませんが、ソースを閲覧したところ、問題が見つかったと思います:
https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/ClassLoader.php#L224
ここに、このコードオートローダーが true と評価された値を返すことを期待していますが、それは spl オートロード メカニズムの要件ではないため、オートローダーは NULL を返すことができます。

私が正しいかどうかを確認するには、プロジェクトのドクトリンで224行目を置き換えますDoctrine/Common/ClassLoader.php

} else if ($loader[0]->{$loader[1]}($className)) {

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

問題が修正されているかどうかを確認し、私が正しければ、Doctrine プロジェクトにバグを報告します

于 2012-11-15T13:35:57.863 に答える