Doctrine insertion dans l'événement postPersist
Je veux ajouter une nouvelle Alimentation de l'élément sur l'entité de persister et de mise à jour. J'écris cet écouteur d'événement (postUpdate est le même):
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();
if ($entity instanceof FeedItemInterface) {
$feed = new FeedEntity();
$feed->setTitle($entity->getFeedTitle());
$feed->setEntity($entity->getFeedEntityId());
$feed->setType($entity->getFeedType());
if($entity->isFeedTranslatable()) {
$feed->getEnTranslation()->setTitle($entity->getFeedTitle('en'));
}
$em->persist($feed);
$em->flush();
}
}
Mais j'ai eu
Intégrité constraint violation: 1062 Duplicate entry '30-2' pour clé
PRIMAIRE
et dans le journal d'un deux insertations:
INSÉRER DANS interview_scientificdirection (interview_id,
scientificdirection_id) VALEURS (?, ?) ([30,2]) INSERT INTO
interview_scientificdirection (interview_id, scientificdirection_id)
Les VALEURS (?, ?) ([30,2])
scientificdirection est plusieurs à Plusieurs table de relation pour l'entité, ce que nous voulons persistent.
En application frontend, tout fonctionne très bien, mais dans Sonata Admin j'ai eu ce problème 🙁
source d'informationauteur nucleartux
Vous devez vous connecter pour publier un commentaire.
Depuis la Doctrine 2.2 vous pouvez joindre les auditeurs à un postFlush événement:
La réponse de Francesc est erroné, car les révisions dans le postFlush événement sont déjà vides.
La deuxième réponse de jhoffrichter pourrait fonctionner, mais c'est du matraquage.
La bonne façon de faire est de persister l'entité dans le postPersist événement et à appeler flush à nouveau dans la postFlush événement. Mais vous ne devez le faire que si vous avez changé quelque chose dans le postPersist événement, sinon vous créez une boucle sans fin.
Si vous avez besoin de persister des objets supplémentaires, le postPersist ou postUpdate gestionnaire dans la Doctrine, malheureusement, n'est pas le bon endroit où aller. J'ai lutté avec le même problème aujourd'hui, car j'avais besoin de générer des entrées de message dans ce gestionnaire.
Le problème à ce stade est que la postPersist gestionnaire est appelé pendant la couleur de l'événement, et non pas après. Donc vous ne pouvez pas persister des objets supplémentaires d'ici, car ils ne reçoivent pas de rincer par la suite. En outre, vous ne pouvez pas appeler flush au cours d'une postPersist gestionnaire, car cela pourrait conduire à ducplicate entrées (comme vous l'avez de l'expérience).
Une façon d'aller de l'est à l'aide de la onFlush gestionnaire de doctrine, documentée ici: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#onflush
C'est seulement un problème si vous avez besoin de l'insertion de l'id de l'objet de base de données, que l'entité n'a pas encore été écrites dans la base de données du gestionnaire. Si vous n'avez pas besoin de ces identifiants, vous êtes très bien avec le ofFlush événement dans la doctrine.
Pour moi, la solution a été un peu différent. Je suis actuellement en train de travailler sur un projet symfony2, et ont besoin de l'id de l'insertion des objets de base de données (pour les rappels et des mises à jour plus tard).
J'ai créé un nouveau service dans symfony2, qui, fondamentalement, tout simplement agit comme une file d'attente pour mes messages. Au cours de la postPersist mise à jour, je viens de remplir les entrées dans la file d'attente. J'ai un autre gestionnaire inscrit sur
kernel.response
qui prend alors les entrées et persiste à la base de données. (Quelque chose le long de la ligne de ceci: http://symfony.com/doc/current/cookbook/service_container/event_listener.html)J'espère que je ne m'éloigne trop du sujet ici, mais comme c'est quelque chose que j'ai vraiment eu du mal avec, j'espère que certaines personnes pourraient trouver cela utile.
Les entrées de service sont:
Vous ne pouvez pas utiliser la
doctrine.listener
pour cela, car cela conduit à une dépendance circulaire (comme vous devez le gestionnaire de l'entité pour le service, mais le gestionnaire de l'entité besoins du service....)Qui a travaillé comme un charme. Si vous avez besoin de plus d'infos à ce sujet, n'hésitez pas à demander, je suis heureux d'ajouter quelques exemples de cette.
Bien, voici comment je l'ai fait dans SF 2.0 et 2.2:
Auditeur classe:
Config.yml:
J'espère que ça aide 😉
La solution de jhoffrichter fonctionne très bien. Si vous utilisez les Commandes de la Console, vous devez ajouter un tag pour la commande de l'événement.mettre fin. Sinon, il n'est pas d'intervenir à l'intérieur de la Console de Commandes. Voir https://stackoverflow.com/a/19737608/1526162
config.yml