2012-08-27 15 views
5

Mam jednostkę użytkownika Doctrine, do której próbuję dodać formularz sprawdzania poprawności do formularza rejestracyjnego, ale nie wystrzeliwuje ona formularza rejestracyjnego pod żadnym warunkiem.Ograniczenia sprawdzania poprawności nie są wyzwalane w przypadku formularza rejestracyjnego

Moja jednostka użytkownika:

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; 

    ... 
    } 

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

I wreszcie, formularz rejestracyjny:

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

Wygląda na to, że musi być brakujące coś oczywistego tutaj, ale między podręcznikiem Symfony a zasobami, które znalazłem w Internecie, nie udało mi się wykryć ustal, co to jest.

+1

masz [włączony] (http://symfony.com /doc/current/book/validation.html#configuration) adnotacje do sprawdzania poprawności? – meze

+0

Tak, mam 'validation: {enable_annotations: true}' ustawiony w moim config.yml w sekcji framework. –

+0

Czy próbowałeś ustawić wartość cascade_validation na swoim RegistrationType? – m0c

Odpowiedz

0

Gdzie znalazłeś tę opcję grupową?

Możesz zostawić to pole puste, aby zostało uruchomione dla tego obiektu. Jeśli chcesz określić encję, wygląda na to, że powinieneś użyć opcji em.

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

+0

Opcja grupy polega na tym, że ograniczenia są usuwane tylko do formularza rejestracyjnego. Nie chcę, aby ograniczenie było uruchamiane przy każdej aktualizacji, inaczej obiekt nigdy nie byłby aktualizowalny bez zmiany adresu e-mail za każdym razem. –

+0

@ Andy, to jest złe. Sprawdzanie poprawności nie zawiedzie podczas próby zaktualizowania obiektu bez zmiany adresu e-mail lub nazwy użytkownika. Ta walidacja sprawdza, czy to pole jest unikalne, tzn. Że żaden inny rekord nie ma tej wartości. Podczas aktualizacji nie sprawdza tego przed ITSELF, więc nie będzie problemu. Czy próbowałeś usunąć funkcję validation_group i opcje grupowe i sprawdzić, czy to działa? –

2

miałem ten sam problem.

postanowiłem go dodanego cascade_validation co prawda w metodzie setDefaultOptions w swojej klasie RegistrationType i używane klasę OptionsResolverInterface z komponentu 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 
     )); 
    } 
} 
Powiązane problemy