2012-08-27 55 views
5

我有一個Doctrine用戶實體,我試圖將表單驗證器添加到註冊表單中,但它們在任何情況下都不會觸發註冊表單。驗證約束不會觸發註冊表單

我的用戶實體:

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; 

    ... 
    } 

這裏是我的用戶等級和積分形式:

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

最後,報名表:

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

好像我必須失去了一些東西明顯在這裏,但是在Symfony手冊和我在網上找到的資源之間,我還沒有弄清楚呃,它是什麼。

+1

你有[啓用](http://symfony.com /doc/current/book/validation.html#configuration)批註進行驗證? – meze

+0

是的,我在框架部分的config.yml中設置了'validation:{enable_annotations:true}'。 –

+0

您是否嘗試過在您的RegistrationType上專門設置cascade_validation? – m0c

回答

0

你從哪裏找到這個羣組選項?

您可以將其留爲空白,以便爲此實體觸發。如果你想指定一個實體,看起來你應該使用em選項。

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

+0

組選項是這樣,約束僅限於註冊表單。我不希望約束在每次更新時觸發,否則如果每次都不更改電子郵件地址,該對象將永遠不可更新。 –

+0

@安迪,這是錯誤的。當您嘗試在不更改電子郵件或用戶名的情況下更新對象時,驗證不會失敗。此驗證檢查此字段是否唯一,即沒有其他記錄具有此值。更新它時不會檢查它與ITSELF,所以它不會有問題。您是否嘗試刪除validation_group和groups選項並查看它是否有效? –

2

我有同樣的問題。

我在你RegistrationType類解決它通過添加cascade_validationsetDefaultOptions方法真正從OptionsResolver Symfony的組件使用的OptionsResolverInterface類:

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