2011-05-21 14 views
6

Tengo un problema con la validación. En Doctrina 1 i utilizado este:Validación de Doctrine 2

if ($model->isValid()) { 
    $model->save(); 
} else { 
    $errorStack = $model->getErrorStack(); 
    ... 
} 

y en $ errorStack tengo el nombre de la columna y el mensaje de error. Pero en Doctrina 2 Puedo utilizar simplemente que:

Entidad

/** 
* @PrePersist @PreUpdate 
*/ 
public function validate() 
{ 
    if ($this->name == null)) { 
     throw new \Exception("Name can't be null"); 
    } 
} 

controlador:

try { 
    $user = new \User(); 
    //$user->setName('name'); 
    $user->setCity('London'); 
    $this->_entityManager->persist($user); 
    $this->_entityManager->flush(); 
} catch(Exception $e) { 
    error_log($e->getMessage()); 
} 

pero tengo dos problemas que la pizca:

  • no sé cual columna?
  • no quiero comprobar manualmente única

Si me salto validar() desde la entidad única será atrapado (a partir de este error.log)

Unique violation: 7 ERROR: duplicate key value violates unique constraint "person_email_uniq" 

pero por ejemplo el usuario guarde 2 registros y el primero es incorrecto, pero el segundo válido, después del primer guardado se cerrará EntityManager y no puedo guardar el segundo (buen) registro debido a "El EntityManager está cerrado".

¿Cuál es la mejor solución para este problema?

Respuesta

3

Hay algunas maneras de hacer la validación en D2: - la lógica de negocio relacionada con una entidad como usted la describe en su puesto - validación basada en los oyentes, comprobar http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html#preupdate, ValidCreditCardListener ejemplo - validación basada en bibliotecas de terceros, algo similar descrito aquí: Zend_Validate_Db_RecordExists with Doctrine 2? y Zend_Validate: Db_NoRecordExists with Doctrine Si utiliza un marco particular para la representación de formularios puede integrar la validación en él.

que utiliza la validación de las entidades de lógica de negocios relacionados con una sola entidad:

/** 
* @PrePersist @PreUpdate 
*/ 
public function validate() 
{ 
    $this->errors = array(); 
    if ($this->name == null)) { 
     $this->errors['name'][] = 'Something wrong'; 
    } 
    if (0 < count($errors)) { 
     throw new Exception('There are errors'); 
    } 
} 

public function getErrors() 
{ 
    return $this->errors; 
} 

y validación oyentes para forzar algunas reglas como singularidad porque en mis entidades de aplicación se pueden crear no sólo sobre la base de formas.

2

Recuerde definir @HasLifecycleCallbacks en la entidad.

/** 
* @Entity @Table(name="songs") @HasLifecycleCallbacks 
*/ 
class Song 
{ 
    ... 
    /** @PrePersist @PreUpdate */ 
    public function doStuffOnPreUpdatePrePersists() 
    { 
     ... 
    } 
}