2012-08-27 15 views
5

Tengo una entidad de usuario Doctrine que estoy tratando de agregar validadores de formulario para el formulario de registro, pero no se activan para el formulario de registro bajo ninguna condición.Las restricciones de validación no desencadenan el formulario de registro

Mi usuario entidad:

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; 

    ... 
    } 

Aquí es mi 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'; 
    } 
} 

Y, por último, el formulario de inscripción:

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'; 
    } 
} 

Parece que debo estar perdiendo algo obvio aquí, pero entre el manual de Symfony y los recursos que he encontrado en línea, no he podido armine lo que es.

+1

¿Ha [Enabled] (http://symfony.com /doc/current/book/validation.html#configuration) anotaciones para la validación? – meze

+0

Sí, tengo 'validation: {enable_annotaciones: true}' establecido en mi config.yml en la sección de framework. –

+0

¿Ha intentado establecer específicamente cascade_validation en su RegistrationType? – m0c

Respuesta

0

¿Dónde encontraste esta opción de grupos?

Puede dejarlo en blanco para que se active para esta entidad. Si desea especificar una entidad, parece que debería usar la opción em.

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

+0

La opción de grupo es por lo que las restricciones se relegan únicamente al formulario de registro. No quiero que la restricción se active en cada actualización, de lo contrario el objeto nunca sería actualizable sin cambiar la dirección de correo electrónico cada vez. –

+0

@Andy, esto está mal. La validación no fallará cuando intente actualizar el objeto sin cambiar el correo electrónico o el nombre de usuario. Esta validación comprueba que este campo sea único, es decir, que ningún otro registro tenga este valor. Al actualizar, esto no se verificará contra SÍ MISMO, por lo que no será un problema. ¿Has intentado eliminar las opciones de validation_group y groups y ver si funciona? –

2

que tenían el mismo problema.

lo resolví por cascade_validation añadido en verdad en el método setDefaultOptions en su clase RegistrationType y se utiliza la clase OptionsResolverInterface del 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 
     )); 
    } 
} 
Cuestiones relacionadas