2012-11-15 2 views
1

Je suis actuellement confronté à une erreur étrange dans mon code. Vous pouvez voir le code complet du projet ZF2s sur my github right here. < - il y a un lienErreur de redeclaration de classe sur targetEntity = "Y" dans ZF2

J'ai un module configuré avec deux entités (X et Y). Entity_X contient une référence à Entity_Y via (targetEntity = "Entity_Y"). L'erreur persiste avec le FQCN ou seulement le CN lui-même.

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

Entity_Y: 
    id int PK, 
    text varchar 

Lors du chargement d'Entity_Y en premier, puis d'Entity_X, tout fonctionne correctement. Cela reste vrai pour StandardAutoloader et ClassMapAutoloader. Cependant: lors du chargement Entity_X d'abord avec ClassMapAutoloader présent, je vais voir l'erreur suivante:

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

Chargement Entity_X d'abord avec StandardAutoloader fonctionne sans aucun problème, aussi.

Mise à jour

Le problème semble être dans ZF2s ClassMapAutoloader (ou Autochargement-mécanisme général). Mon module a utilisé le ClassMapAutoloader et en utilisant ce que j'ai eu l'erreur mentionnée ci-dessus. Lors du retrait du ClassMapAutoloader et de l'utilisation de l'utilitaire StandardAutoloader, l'erreur s'est dissipée. Merci à @ocramius et tous les autres que j'ai botheres avec ce :)

+0

Je vais avoir le même problème, sauf qu'il n'apparaît lorsque je tente de charger une entité d'une action du contrôleur CLI. Appeler la même méthode de mappeur à partir d'une action de contrôleur HTTP fonctionne correctement. https://gist.github.com/017c56ac2ae7553a7ca5 –

Répondre

2

je n'ai aucune connaissance de la doctrine, mais je par source et parcouru je pense que je l'ai trouvé question:
https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/ClassLoader.php#L224
ici, ce code prévoit que autoloader sera la valeur retournée évaluée à true, mais ce n'est pas besoin d'un mécanisme spl autoload donc autoloader peut retourner NULL,

pour vérifier si je ne me trompe pas, dans votre projet dans la doctrine remplacer la ligne 224 dans Doctrine/Common/ClassLoader.php

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

avec

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

Ans problème est résolu, si je ne me trompe pas - rapport alors bug à projet doctrine

+1

Je ne comprends pas pourquoi ils bouclent à travers les chargeurs automatiques enregistrés du tout. 'class_exists ($ NAME, TRUE)' devrait être suffisant – Xerkus

+1

Puisque le problème est lié à DoctrineORMModule (et je ne pense pas que nous utilisions le classloader de Doctrine n'importe où), je ne pense pas que ce soit la bonne solution ... – Ocramius

+1

@Ocramius, comme discuté dans irc: issue est dans la classe classExists() utilitaire de ClassLoader, qui appelle les chargeurs automatiques enregistrés – Xerkus

4

J'écris un test ne pas essayer de résoudre ce dans doctrine/common. Le problème semble être que les autoloaders silencieux (comme expliqué par @Xerkus) ne sont pas compatibles avec doctrine/common lui-même. Pour résoudre ce problème, utilisez un StandardAutoloader de ZF2 (ou de composer) au lieu d'utiliser le ClassMapAutoloader. Cela résoudra le problème jusqu'à ce qu'un correctif soit prêt.

Mise à jour: patch est proposé à doctrine/common#216

+1

J'ai appliqué vos commits à mon clone local et il a réglé le problème. Merci à vous et à Xerkus pour le dépannage! –

Questions connexes