J'ai ce comportement avec Doctrine 2.1 où je suis à la recherche d'une bonne 'solution de contournement'. Le problème est le suivant:Doctrine ne charge pas les associations de la session correctement
J'ai un utilisateur d'entité:
/**
* @Entity(repositoryClass="Application\Entity\Repository\UserRepository")
* @HasLifecycleCallbacks
*/
class User extends AbstractEntity
{
/**
*
* @var integer
*
* @Column(type="integer",nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
*
* @var \DateTime
* @Column(type="datetime",nullable=false)
*/
protected $insertDate;
/**
*
* @var string
* @Column(type="string", nullable=false)
*/
protected $username;
/**
*
* @ManyToOne(targetEntity="UserGroup", cascade={"merge"})
*/
protected $userGroup;
}
Et usergroup entité:
/**
* @Entity
*/
class UserGroup extends AbstractEntity
{
/**
*
* @var integer
*
* @Column(type="integer",nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
*
* @var string
* @Column(type="string",nullable=false)
*/
protected $name;
}
Si j'instancier un objet utilisateur (le faire avec Zend_Auth) et Zend_Auth met automatiquement la session. Le problème est cependant que je le retire de la session à la page suivante puis les données de la classe d'utilisateur sont parfaitement chargées mais pas dans l'association userGroup. Si j'ajoute cascade = {"merge"} dans l'annotation de l'objet utilisateur, l'objet userGroup est chargé mais les données sont vides. Si vous videz quelque chose comme:
$user->userGroup->name
Vous obtiendrez NULL de retour. Le problème est qu'aucune donnée de l'entité du groupe d'utilisateurs n'est accessible avant que l'objet utilisateur ne soit enregistré dans la session, de sorte qu'un objet initialisé vide sera renvoyé. Si je fais quelque chose comme:
echo $user->userGroup->name;
Avant stocker l'objet utilisateur dans la session toutes les données du userGroup de assocication est correctement enregistré et ne reviendra pas NULL à la page suivante si je tente d'accéder à la user- de $ > userGroup-> variable de nom.
Existe-t-il un moyen simple de résoudre ce problème? Puis-je charger manuellement l'objet/l'association userGroup avec un rappel de cycle de vie @onLoad dans la classe d'utilisateurs peut-être? Aucune suggestion?
J'ai essayé cela mais le problème réel est que l'association userGroup n'est PAS remplie AVANT qu'elle ne soit sérialisée. Cela provoque que merge() ne soit pas affecté même si vous l'appelez directement à l'objet userGroup lui-même. Ce problème se produit lorsque vous n'accédez pas à l'objet userGroup avant qu'il ne soit sérialisé car Doctrine charge les données d'entité uniquement lorsqu'il est appelé. Avez-vous mon problème? Pour l'instant, j'ai une solution de contournement avec echo $ user-> userGroup-> name; mais ce n'est pas gentil. Je cherche quelque chose pour charger manuellement l'entité userGroup. J'espère que tu as compris. –