2013-06-29 8 views
12

ho questo metodo nella mia entità:PreUpdate non innescato

/** 
    * @ORM\PreUpdate() 
    * @ORM\PrePersist() 
    */ 
    public function preStore() { 
     if ($this->getPictureFile()) { 
      $newFilename = sha1(mt_rand()); 
      $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension()); 
      $this->setPictureFilename($newFilename); 
     } 
    } 

e gli oggetti quando persiste tutto funziona perfettamente, ma aggiornata il metodo non viene attivato a tutti, ho provato in questo modo:

/** 
    * @ORM\PreUpdate() 
    * @ORM\PrePersist() 
    */ 
    public function preStore() { var_dump('asdasdasdadsdasdas'); 
     if ($this->getPictureFile()) { 
      $newFilename = sha1(mt_rand()); 
      $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension()); 
      $this->setPictureFilename($newFilename); 
     } 
    } 

E in persistente var_dump funziona, ma quando aggiorno l'oggetto - non lo fa. Perché?

risposta

6

si deve dire in modo esplicito la dottrina che il soggetto ha del ciclo di vita-callback:

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YourClass 

ulteriormente che non è necessario il finale () nelle vostre annotazioni se non prvovide alcuna opzione.

/** 
* @ORM\PrePersist 
* @ORM\PreUpdate 
*/ 
public function preStore() 

è consigliabile utilizzare un ascoltatore/abbonato al posto del ciclo di vita callback che facilitano il riutilizzo e mantenere il più pulito entità.

Ulteriori informazioni sono disponibili nel capitolo di ricettario How to Register Event Listeners and Subscribers.

+2

Se non avessi @ORM \ HasLifeCycleCallbacks allora il prepersivo non avrebbe funzionato e, come ho detto, funziona perfettamente. La rimozione di trailing() non ha modificato nulla.So che posso farlo con gli ascoltatori di eventi ma voglio sapere perché non funziona? – user2394156

41

Un aggiornamento si verifica solo se un campo di entità (visto da una dottrina) viene modificato e così il metodo di pre-aggiornamento viene chiamato solo dopo una modifica.

Attenzione: credo che il tuo file immagine non sia una colonna di dottrina e così via non vista dalla dottrina. Quindi la tua entità non cambia per la dottrina.

Dall'articolo How to handle File Uploads with Doctrine libro di cucina

I callback PreUpdate e postUpdate vengono attivati ​​solo se v'è un cambiamento in uno dei campo dell'entità che sono persisteva. Ciò significa che, per impostazione predefinita, se si modifica solo la proprietà $ file, questi eventi non verranno attivati, poiché la proprietà stessa non viene mantenuta direttamente tramite Doctrine. Una soluzione sarebbe utilizzare un campo aggiornato che è persistente in Doctrine e modificarlo manualmente quando si modifica il file.

EDIT: O si utilizza il Uploadable behavior del doctrine extensions

+0

Hmmm ... quindi se cambio la colonna della dottrina su qualsiasi cosa, "xxx" per esempio - allora dovrebbe funzionare dopotutto dal momento che il nome del file della doctrine viene quindi modificato in uno generato automaticamente? – user2394156

+0

@PatrikKarishch ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡GRIGIOSSSSSSSSS (THANKSSSSSSSSSS) !!!!!!!!!!!!!!!!!!!!!!! – ziiweb

0

Un altro motivo per cui questo può fallire è se si dispone di un solo asterisco

non riesce: /* @ORM\PrePersist */

riesce: /** @ORM\PrePersist */

Ridicolo, ma è proprio così ..

3

Ho incontrato lo stesso problema, ecco la mia soluzione:

aggiungere un campo mappato updatedAt e basta chiamare setUpdatedAt(new \DateTime()) all'interno della setter della vostra UploadedFile questo attiverà il preUpdate-Event per l'entità

+0

Una buona soluzione di pari passo con la risposta di @ Patrik che spiega perché questo funziona – Prof83

Problemi correlati