2012-07-04 8 views
9

tengo un problema: en un proceso, quiero cancelar el ahorro de una entidad en función de prePersit:Cómo cancelar el almacenamiento de una entidad cuando estancia en función PrePersist

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

En función de arriba, no quiero para guardar esta entidad más, y no quiero detener mi proceso (el proceso todavía guarda otro s)

Respuesta

4

No puede hacer eso usando la anotación prePersist dentro de su entidad. El problema con su enfoque es que no puede acceder al entityManager dentro de su modelo, pero necesitará eso para decirle que no persista en su enity.

Se puede usar un detector de eventos como se explica en la documentación de la doctrina: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

A continuación, escuchar el caso PrePersist, ver si alguna entidad del tipo en cuestión pide ser persistido y ver si su condición es cierto. De ser así, podría decirle al entityManager que separe la entidad.

PERO Creo que se puede hacer mucho más simple ajustando el contenido a notnull y transformar el contenido a un valor nulo si la longitud es < 1. Asegurarse de que persistan las entidades correctas es parte de la lógica de dominio y que no lo haría esto en la entidad misma o en algún oyente de eventos. Si tienes muchos de esos oyentes y condiciones, terminas con muchas restricciones mágicas que nadie conoce.

Además del enfoque anterior, podría implementar un método válido() y verificar si se cumplen ciertas condiciones. Su lógica de dominio solo persistirá en la entidad si valid() es verdadera. Un enfoque aún mejor es usar el validador symfony2 para validar su entidad y luego actuar en consecuencia.

+0

Gracias, intentaré crear un detector de eventos. – user1501227

+0

El acceso a la documentación está restringido, por favor revise el enlace. Me aparece "No tienes acceso a esta versión". –

+0

Gracias por su pista. El nuevo enlace es http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners. ¡Edité la respuesta original en consecuencia! – Sgoettschkes

2

Acaba de lanzar la nueva excepción ("Some message ...");

+0

El OP solicitó que la solución no detenga el proceso general. –

+1

Es por eso que atrapa la excepción del código de llamada y trata el escenario. – caponica

Cuestiones relacionadas