2012-05-02 13 views
12

Tengo un formulario para crear una nueva entidad. Esa entidad tiene una colección de otras entidades que también se ingresan en esa forma.Symfony2 + Doctrine - Validación de la colección uno-a-muchos de entidades

Quiero usar las opciones de validación de la entidad en la colección para validar esas entidades, pero no funciona. Se verifican las reglas de validación de la entidad "principal" (Persona), pero las reglas de validación de las entidades en la colección addressList (Dirección) no se verifican. Cuando ingreso información no válida en los campos, el formulario enviado se valida con éxito.

En este ejemplo, la anotación para calle no se utiliza en la validación.

class Person 
{ 
    ... 

    /** 
    * @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
    */ 
    protected $addressList; 

    .... 
} 

class Address 
{ 
    ... 
    /** 
    * @ORM\ManyToOne(targetEntity="Person", inversedBy="addressList") 
    * @ORM\JoinColumn(name="person_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $owner; 

    /** 
    * @ORM\Column(type="string", length=75) 
    * @Assert\MinLength(
    *  limit=3, 
    *  message="Street must have atleast {{ limit }} characters." 
    *) 
    */ 
    protected $street; 

    ... 

} 

¿Cómo puedo obtener el formulario para validar las Entidades de dirección proporcionadas?

+2

me fijo esto añadiendo ' 'cascade_validation' => true' a la matriz de' getDefaultOptions() 'de la PersonType. – Bramklg

Respuesta

0

Usted podría también utilizar el "Valid" restricción con el "All" restricción:

/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
* @Assert\All({ 
*  @Assert\Valid 
* }) 
*/ 

protected $addressList; 
+1

¿Estás seguro? Esto me da "La restricción válida no se puede anidar dentro de la restricción Symfony \ Component \ Validator \ Constraints \ All. Solo se puede declarar la restricción válida directamente en un campo o método". en 2.1 – nurikabe

+0

No estoy seguro. Creo que estaba usando 2.0 en ese momento y tuve que lidiar con un problema similar. Si no funciona, tal vez debería eliminar mi respuesta. – Julien

+2

Esto ya no funciona con 2.6+ seguro. – tftd

13

he tenido el mismo problema, pero se resolvió con:

/** 
* @ORM\OneToMany(
* targetEntity="Entity", 
* mappedBy="mappedEntity", 
* cascade={"persist" , "remove"} 
*) 
* @Assert\Valid 
*/ 
+0

Esto validará que cada dirección de la lista solo sea válida. Pero si quiere más validaciones, mire la respuesta de @sergey-polischook desde abajo – Jekis

7

utilizo este:

use Symfony\Component\Validator\ExecutionContextInterface; 

class Person 
{ 
... 

/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="owner", cascade={"persist", "detach"}) 
*/ 
protected $addressList; 

.... 

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context) 
{ 
    if (!$this->getAddressList()->count()) { 
     $context->addViolationAt(
      'addressList', 
      'You must add at least one address', 
      array(), 
      null 
     ); 
    } 
} 
} 

http://symfony.com/doc/current/reference/constraints/Callback.html

+0

También agregue @Asertar \ Válido a $ addressList y será la solución completa – Jekis

4

Sólo tiene que añadir anotación afirmar como siguiente

/** 
* @Assert\Count(
*  min = "1", 
*  minMessage = "You must specify at least one" 
*) 
* @Assert\Valid 
* 
*/ 
protected $name_of_collection_property; 
Cuestiones relacionadas