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


Symfony 2.5 Validation Group: One for registration and one for account

>我有一个地址实体,我想在注册时验证与IM登录时"更改地址"不同的地址实体。

这是我的地址实体:

 /**
 * 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;
// ...
}

当用户注册时,我不希望验证组"地址更改"。当有人更改他的地址时,我希望验证"默认"和"地址更改"组。

为此,我现在在我的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())
        { ....}

不知何故?

我认为我目前得到的解决方案不是最好的。问候。

您可以使用

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