2012-08-27 6 views
5

Ho un'entità utente di Doctrine a cui sto tentando di aggiungere moduli di convalida per il modulo di registrazione ma che non attivano il modulo di registrazione in alcuna condizione.I vincoli di convalida non si attivano per il modulo di registrazione

La mia impresa utilizzatrice:

namespace JMSHockey\AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
/** 
* My\AppBundle\Entity\User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="My\AppBundle\Entity\UserRepository") 
* @UniqueEntity(fields={"email"}, message="Sorry, this email address is already in use.", groups={"registration"}) 
* @UniqueEntity(fields={"username"}, message="Sorry, this username is already taken.", groups={"registration"}) 
*/ 
class User implements AdvancedUserInterface,\Serializable 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=75, nullable=false) 
    * @Assert\Email() 
    * @Assert\NotBlank() 
    */ 
    private $email; 

    /** 
    * @var string $username 
    * 
    * @ORM\Column(name="username", type="string", length=75, nullable=false) 
    * @Assert\NotBlank() 
    */ 
    private $username; 

    ... 
    } 

Ecco la mia forma UserType:

namespace My\AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('email','email'); 
     $builder->add('username','text'); 
     ... 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'My\AppBundle\Entity\User', 
      'validation_groups' => array('registration'), 
     ); 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 
} 

E, infine, il modulo di registrazione:

namespace My\AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('user', new UserType()); 
    } 

    public function getName() 
    { 
     return 'registration'; 
    } 
} 

Sembra Devo mancare qualcosa di ovvio qui, ma tra il manuale di Symfony e le risorse che ho trovato online, non sono stato in grado di scoprire ermellino di cosa si tratta

+1

Vi siete [Enabled] (http://symfony.com /doc/current/book/validation.html#configuration) annotazioni per la convalida? – meze

+0

Sì, ho 'validation: {enable_annotations: true}' impostato nel mio config.yml sotto la sezione framework. –

+0

hai provato a impostare in modo specifico cascade_validation sul tuo RegistrationType? – m0c

risposta

0

Dove hai trovato questa opzione di gruppo?

È possibile lasciarlo in bianco in modo che venga attivato per questa entità. Se vuoi specificare un'entità, sembra che dovresti usare l'opzione em.

http://symfony.com/doc/master/reference/constraints/UniqueEntity.html#em

+0

L'opzione di gruppo è così i vincoli sono relegati solo al modulo di registrazione. Non voglio che il vincolo si attivi su ogni singolo aggiornamento, altrimenti l'oggetto non sarebbe mai aggiornabile senza cambiare l'indirizzo e-mail ogni volta. –

+0

@Andy, questo è sbagliato. La convalida non fallirà quando si tenta di aggiornare l'oggetto senza modificare l'e-mail o il nome utente. Questa convalida verifica che questo campo sia unico, ovvero che nessun altro record abbia questo valore. Quando si aggiorna, non lo controlla contro STESSO, quindi non sarà un problema. Hai provato a rimuovere le opzioni validation_group e groups e vedere se funziona? –

2

Ho avuto lo stesso problema.

ho risolto facendo aggiunto cascade_validation al vero nel metodo setDefaultOptions nella classe RegistrationType e utilizzato la classe OptionsResolverInterface dal componente OptionsResolver Symfony:

namespace My\AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface 

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('user', new UserType()); 
    } 

    public function getName() 
    { 
     return 'registration'; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'cascade_validation' => true 
     )); 
    } 
}