2016-03-22 4 views
3

Ich habe eine EntityWie wird die mit @PrePersist annotierte Methode ausgeführt, bevor eine Eigenschaft von @Timestampable gesetzt wird?

class Foo{ 
    /** 
    * @var \DateTime 
    * @Gedmo\Timestampable(on="create") 
    * @ORM\Column(type="datetimetz") 
    */ 
    private $createdAt; 

    /** 
    * @ORM\PrePersist 
    */ 
    public function bar() 
    { 
     $this->createdAt->getTimestamp(); 
    } 
} 

Leider ist die Foo :: bar() ausgeführt werden, bevor die TimestampableListener die Möglichkeit hat, den richtigen Wert von $this->createdAt einzustellen.

Ich versuchte, die Priorität des Ereignis-Listeners in services.yml zu ändern (wie in Can I define the order in which event listeners/subscribers are called in doctrine? angedeutet), aber es funktioniert nicht.

+0

@chalasr: Ich bin neu, aber warum würden Sie meinen Beitrag bearbeiten? Zeitstempel war ein korrekter Typ. – Zibi

+0

Tut mir wirklich leid, ich glaubte, es sei ein Fehler! Es ist das erste Mal, dass ich diesen Typ sehe. – chalasr

+0

@chalasr, es ist OK. :) – Zibi

Antwort

1

Wie Sie in Lehre der ListenersInvoker die LifecycleCallbacks aufgerufen werden, bevor die EntityListeners sehen können, so wird die TimestampableListener nie vor dem PrePersist Anmerkung laufen.

Sie könnten entweder Ihren eigenen EntityListener erstellen, der das prePersist-Ereignis abhört, und Ihre bar-Methode aufrufen und die Priorität verwenden, um die Reihenfolge zu ändern. Oder, im Fall der Definition der createdAt, könnten Sie vermeiden, Timestampable verwenden und setzen Sie den Wert createdAt im Konstruktor manuell.

+0

EntityListener hat den Job gemacht. – Zibi

Verwandte Themen