2012-07-04 9 views
9

Ho un problema: in un processo, voglio annullare il salvataggio un'entità in funzione prePersit:Come annullare salvare un'entità quando soggiorno in funzione prePersist

/** 
* @ORM\PrePersist 
*/ 
public function setTranslationsValue2() 
{ 
    if((null===$this->getContent())or($this->getContent()=='')) 
    { 
     //wanna stop saving this item??? 
     return false; 
    } 
} 

Alla funzione di cui sopra, non voglio per salvare ulteriormente questa entità e non interrompere il processo (il processo salva ancora altri s)

risposta

4

Non è possibile farlo utilizzando l'annotazione prePersist all'interno della propria entità. Il problema con il tuo approccio è che non puoi accedere all'entitàManager all'interno del tuo modello, ma avresti bisogno di questo per dirgli di non ostentare la tua identità.

È possibile utilizzare un listener di eventi, come spiegato nella documentazione dottrina: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

Si potrebbe quindi ascoltare l'evento prePersist, vedere se qualsiasi entità del tipo in questione chiede di essere persistente e vedere se la sua condizione è vero. In tal caso, potresti dire all'ententManager di staccare l'entità.

MA Credo che si potrebbe fare molto più semplice impostando il contenuto alla notnull e trasformando il contenuto nullo se la lunghezza è < 1. Facendo in modo di persistere entità corretta è parte della logica di dominio e io non lo farei questo nell'entità stessa o in qualche ascoltatore di eventi. Se hai molti di questi ascoltatori e condizioni, finisci con molti vincoli magici di cui nessuno è a conoscenza.

Accanto all'approccio precedente è possibile implementare un metodo valido() e verificare se sono soddisfatte determinate condizioni. La logica del tuo dominio manterrà l'entità solo se valid() è true. Un approccio ancora migliore consiste nell'usare il validatore symfony2 per convalidare la propria entità e quindi agire di conseguenza.

+0

Grazie, cercherò di creare un listener di eventi. – user1501227

+0

L'accesso alla documentazione è limitato, si prega di controllare il collegamento. Ricevo "Non hai accesso a questa versione". –

+0

Grazie per il tuo suggerimento. Il nuovo collegamento è http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners. Ho modificato la risposta originale di conseguenza! – Sgoettschkes

2

Basta lanciare la nuova eccezione ("Qualche messaggio ...");

+0

L'OP ha richiesto che la soluzione non interrompesse il processo generale. –

+1

Ecco perché intercettate l'eccezione dal codice chiamante e gestite lo scenario. – caponica

Problemi correlati