Symfony 2.5验证组:一个用于注册,一个用于帐户

时间:2014-12-11 17:02:46

标签: php validation symfony

我有一个地址实体,我希望在注册时验证不同,而不是在我登录时验证“更改地址”。

这是我的地址实体:

 /**
 * Address
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="BooksProj\UserBundle\Entity\AddressRepository")
 * @CustomAssert\AddressChange(groups={"AddressChange"})
 */
class Address
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;


/**
 * @var User
 *
 * @ORM\OneToOne(targetEntity="User", mappedBy="address")
 */
protected $user;

/**
 * @var string
 *
 * @ORM\Column(name="state", type="string", length=255)
 *
 * @Assert\NotBlank()
 * @Assert\Length(min=2, max=50)
 */
private $state;

/**
 * @var string
 *
 * @ORM\Column(name="city", type="string", length=255)
 *
 * @Assert\NotBlank()
 * @Assert\Length(min=2, max=50)
 */
private $city;

/**
 * @var string
 *
 * @ORM\Column(name="zipcode", type="string", length=255)
 *
 * @Assert\NotBlank()
 * @Assert\Length(min=2, max=50)
 */
private $zipcode;


/**
 * @var string
 *
 * @ORM\Column(name="country", type="string", length=255)
 * @Assert\NotBlank()
 */
private $country;

// ...
}

当用户注册时,我不希望验证组“AddressChange”。 当有人更改其地址时,我希望验证“默认”和“地址更改”组。

为此,我现在在AddressFormType中有以下内容:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    if ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
        $resolver->setDefaults(array(
            'data_class' =>  'BooksProj\UserBundle\Entity\Address',
            'validation_groups' => array('Default', 'AddressChange'),
        ));
    }else{
        $resolver->setDefaults(array(
            'data_class' =>  'BooksProj\UserBundle\Entity\Address',
        ));
    }
}

这是处理我目的的唯一方法吗? 或者我可以传递组,在调用时应该在我的ChangeAddressFormHandler中验证:

if ($this->form->isValid())
        { ....}
不知怎的?

我认为我现在得到的解决方案并不是最好的。 问候。

1 个答案:

答案 0 :(得分:0)

您可以使用validator服务,只需在第二个参数中传递数组中的验证组。

 $validator = $this->get('validator');
 $errors = $validator->validate($yourEntity, array('AddressChange', 'Default');

 if (count($errors) > 0) 
 {
     $errorsString = (string) $errors;

     return new Response($errorsString);
 }

 return new Response('Form is valid!);

或第二种方式:

    $form = $this->createForm(new YourForm(), $yourEntity, array('validation_groups'=>'AddressChange'));

或第三种方式:

$resolver->setDefaults(array(
                    'data_class' =>  'BooksProj\UserBundle\Entity\Address',
                    'validation_groups' => function(FormInterface $form){
                        $yourEntity = $form->getData();
                        if(  "Your condition" )
                            return array('Default', 'AddressChange');
                        else
                            return array('Default');
                        }
                ));