2012-08-27 20 views
5

Tôi có một thực thể người dùng Doctrine mà tôi đang cố gắng thêm trình xác nhận biểu mẫu vào biểu mẫu đăng ký nhưng họ không kích hoạt biểu mẫu đăng ký trong bất kỳ điều kiện nào.Ràng buộc xác nhận không kích hoạt cho mẫu đăng ký

tượng người dùng của tôi:

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; 

    ... 
    } 

Dưới đây là hình thức của tôi loại người dùng:

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

Và cuối cùng, hình thức đăng ký:

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

Nó có vẻ như tôi phải mất một cái gì đó rõ ràng ở đây, nhưng giữa hướng dẫn sử dụng Symfony và tài nguyên tôi tìm thấy trực tuyến, tôi đã không thể ermine nó là gì.

+1

Có bạn [kích hoạt] (http://symfony.com /doc/current/book/validation.html#configuration) chú thích để xác thực? – meze

+0

Có, tôi có 'validation: {enable_annotations: true}' được đặt trong config.yml của tôi trong phần khung công tác. –

+0

bạn đã cố gắng đặt cụ thể cascade_validation trên RegistrationType chưa? – m0c

Trả lời

0

Bạn đã tìm thấy tùy chọn nhóm này ở đâu?

Bạn có thể để trống để nó sẽ được kích hoạt cho thực thể này. Nếu bạn muốn chỉ định một thực thể, có vẻ như bạn nên sử dụng tùy chọn em.

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

+0

Tùy chọn nhóm là vì vậy các ràng buộc chỉ được chuyển xuống biểu mẫu đăng ký. Tôi không muốn các ràng buộc để bắn trên mỗi bản cập nhật duy nhất, hoặc người nào khác đối tượng sẽ không bao giờ được cập nhật mà không thay đổi địa chỉ e-mail mỗi lần. –

+0

@Andy, điều này là sai. Việc xác nhận sẽ không thất bại khi bạn cố cập nhật đối tượng mà không thay đổi email hoặc tên người dùng. Việc xác thực này kiểm tra rằng trường này là duy nhất, nghĩa là không có bản ghi nào khác có giá trị này. Khi cập nhật nó sẽ không kiểm tra điều này chống lại ITSELF, do đó, nó sẽ không có vấn đề. Bạn đã thử xóa các tùy chọn validation_group và groups và xem nó có hoạt động không? –

2

tôi đã cùng một vấn đề.

tôi giải quyết nó bằng cách thêm cascade_validation tại đúng trong phương pháp setDefaultOptions trong lớp RegistrationType của bạn và sử dụng lớp OptionsResolverInterface từ các thành phần 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 
     )); 
    } 
} 
Các vấn đề liên quan