Innerhalb derselben Entität habe ich ein PreUpdate und ein PrePersist. Das PreUpdate wird ausgelöst, aber das PrePersist nie. Ich habe ein die() nach dem Flush und Kommentaren innerhalb der Lifecycle-Callbacks. Die vollständige Entität kann unter eingesehen werden http://pastebin.com/yUk1u4GQ
Rückrufe von Entitäten
/**
* @PreUpdate
*/
public function fixDates(){
$this->updatedOn = $this->getNow();
$this->closedDate = null;
$this->openDate = null;
print "dates fixed";
}
/**
* @PrePersist
*/
public function prePersist() {
print 'in prePersist';
die();
}
Entity Manager-Anrufe
$em->persist($school);
$em->flush();
die();
Mein Bildschirm zeigt “Termine fixiert”, aber nicht die prePersist-Meldung. Ich habe die @HasLifecycleCallbacks an der Spitze der Entität.
Vergessen Sie nicht, Lifecycle Callbacks in Ihrer Klassenanmerkung zu aktivieren:
/**
* Report\MainBundle\Entity\Serveur
* @ORM\HasLifecycleCallbacks
*/
class Serveur {
Das war mein Problem. Vielen Dank!
– Jasonlfunk
14. Mai 2015 um 16:21 Uhr
ich habe gefehlt @HasLifecycleCallbacks. Vielen Dank!
– MParsons
16. Mai 2016 um 14:18 Uhr
Johann
PrePersist wird nur ausgelöst, wenn Sie auftreten INSERT Aussage, nicht UPDATE Aussage.
Vergessen Sie beim Testen nicht, dass die UPDATE -Anweisung wird nur ausgelöst, wenn sich die Entitätsattribute wirklich ändern. Wenn der Entity Manager aufgerufen wird, um diese Entität beizubehalten, prüft er zuerst, ob es Änderungen gibt. Wenn nicht, wird keine SQL-Abfrage durchgeführt und nein @PreUpdate Methode aufgerufen wird.
Hochgestimmt. Ich habe das auch auf die harte Tour herausgefunden (über Schritt-Debugging), als mein Code nicht wie erwartet funktionierte. IMO macht die aktuelle Dokumentation dies nicht klar genug, was ein leichter Fehler ist.
– iainp999
30. Mai 2014 um 12:33 Uhr
Ich weiß, dass diese Frage fast 2 Jahre alt ist, aber ich hatte gerade genau das gleiche Problem und da dies keine akzeptierte Antwort hat, möchte ich eine letzte Sache teilen, die alle anderen vergessen haben zu erwähnen.
Obwohl es scheint, dass die ausgelöste Methode nur von der Entitätsklasse selbst verwendet wird, sollte ihr Geltungsbereich öffentlich gehalten werden. Meine Methode löste nicht aus, nur weil ich sie als geschützt markiert hatte. Ich hoffe, das wird jemandem helfen.
Das war auch mein Problem! Zusammen mit @ORM\HasLifecycleCallbacks
– Guss
29. April 2019 um 15:20 Uhr
Ich hatte gerade das gleiche Problem. Hoffe das hilft dir:
Ich habe vergessen, die Anmerkungen mit der use-Anweisung zu importieren. Wenn Sie dies versuchen, vergessen Sie nicht, das Präfix “ORM” hinzuzufügen:
use Doctrine\ORM\Mapping as ORM;
// ...
/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
Vielleicht ist es versionsabhängig, aber meine Arbeitsanmerkungen haben eine nächste Ansicht:
Ja!! Gemäß Dokumenten in Doktrin 2 Markiert eine Methode auf der Entität, die als @ PrePersist-Ereignis aufgerufen werden soll. Funktioniert nur mit @ HasLifecycleCallbacks in der Entitätsklasse PHP DocBlock.
– Leonardo Beal
16. August 2017 um 6:43 Uhr
Ja!! Gemäß Dokumenten in Doktrin 2 Markiert eine Methode auf der Entität, die als @ PrePersist-Ereignis aufgerufen werden soll. Funktioniert nur mit @ HasLifecycleCallbacks in der Entitätsklasse PHP DocBlock.
– Leonardo Beal
16. August 2017 um 6:43 Uhr
11010400cookie-checkLehre 2 PrePersist wird nicht ausgelöstyes