2012-05-02 16 views
12

Ho un modulo per creare una nuova entità. Tale entità ha una raccolta di altre entità che sono anche inserite in quella forma.Symfony2 + Doctrine - Convalida della raccolta uno-a-molti di entità

Desidero utilizzare le opzioni di convalida dell'entità nella raccolta per convalidare tali entità ma non funziona. Le regole di convalida dell'entità "principale" (Persona) sono controllate, ma le regole di convalida delle entità nella collezione addressList (Indirizzo) non sono selezionate. Quando immetto informazioni non valide nei campi, il modulo inviato viene convalidato correttamente.

In questo esempio, l'annotazione per strada non viene utilizzata per la convalida.

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; 

    ... 

} 

Come posso ottenere il modulo per convalidare le entità indirizzo fornite?

+2

ho risolto questo con l'aggiunta ' 'cascade_validation' => true' alla matrice di' getDefaultOptions() 'del PersonType. – Bramklg

risposta

0

Si potrebbe anche usare il "Valid" vincolo con il "All" vincolo:

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

protected $addressList; 
+1

Sei sicuro? Questo mi dà "Il vincolo Valid non può essere annidato all'interno del vincolo Symfony \ Component \ Validator \ Constraints \ All. Puoi solo dichiarare il vincolo valido direttamente su un campo o un metodo." in 2.1 – nurikabe

+0

Non ne sono più sicuro. Penso che stavo usando 2.0 in quel momento e ho dovuto affrontare un problema simile. Se non funziona forse dovrei rimuovere la mia risposta. – Julien

+2

Questo non funziona più con 2.6+ di sicuro. – tftd

13

Ho avuto lo stesso problema, ma è stato risolto con:

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

Verificherà che ciascun indirizzo dall'elenco è valido solo per l'indirizzo. Ma se vuoi altre validazioni guarda la risposta @ sergey-polischook dal basso – Jekis

7

Io uso questo:

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

Aggiungi anche @Assert \ Valid a $ addressList e sarà la soluzione completa – Jekis

4

Basta aggiungere annotazioni affermare come seguire

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