在Symfony2中对同一实体的不同验证规则


Different validation rules on same entity in Symfony2

管理员将能够编辑其网站的用户,但不能编辑密码。所以我创建了这个编辑用户表单类型:

namespace CAPUserBundle'Form'Type;
use CAPShopAdminBundle'Repository'DiscountGridRepository;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Form'Extension'Core'Type'TextType;
use Symfony'Component'Form'Extension'Core'Type'EmailType;
use Symfony'Component'Form'Extension'Core'Type'ChoiceType;
use Symfony'Bridge'Doctrine'Form'Type'EntityType;
use Symfony'Component'Form'Extension'Core'Type'SubmitType;
class EditUserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', EmailType::class);
        $builder->add('discountGrid', EntityType::class, array(
            'class' => 'CAPShopAdminBundle:DiscountGrid',
            'choice_label' => 'name',
            'placeholder' => '-- Aucune --',
            'required' => false,
            'query_builder' => function (DiscountGridRepository $r) {
                $qb = $r->createQueryBuilder('d');
                $qb->orderBy('d.name', 'ASC');
                return $qb;
            },
            'attr' => array("autocomplete" => "off"),
        ));
        $builder->add('isActive', ChoiceType::class, array(
            'choices' => array(
                'Actif' => '1',
                'Désactivé' => '0'
            ),
        ));
        $builder->add('name', TextType::class);
        $builder->add('firstname', TextType::class);
        $builder->add('company', TextType::class);
        $builder->add('address', TextType::class);
        $builder->add('postcode', TextType::class);
        $builder->add('city', TextType::class);
        $builder->add('phone', TextType::class);
        $builder->add('fax', TextType::class);
        $builder->add('save', SubmitType::class);
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'CAPUserBundle'Entity'User',
        ]);
    }
    public function getName()
    {
        return 'edit_user_form';
    }
} 

但是当我验证表单时,我的用户实体中的 plainPassword 字段出现错误。

This value should not be blank.     edit_user   
Symfony'Component'Validator'ConstraintViolation
Object(Symfony'Component'Form'Form).data.plainPassword = 

实际上,它有一个 NotBlank 验证约束,以强制用户在注册时设置密码。

我的

问题是:如何绕过此约束来编辑我的用户?密码字段在 EditUserFormType 上不存在,因此 plainPassword 是无用的。但是我被困住了,因为我使用相同的用户实体,其中设置了 NotBlank 值。

目前,我用以下方法强制使用plainPassord字段:

$user->setPlainPassword('Ap@ssw0rd');

但这是一种绕过约束的可怕方式......

将验证组用于区分验证规则。

在这种情况下,注册需要普通密码,编辑不需要密码。

因此,为NotBlank约束设置"注册"组。

我选择了一种完全不同的方法,放弃了数据模型中类似注释的验证规则,而是使用表单类中的约束。例如:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $dateConstraintFrom = new Date();
    $notBlankDateFrom = new NotBlank();
    $builder->add('date_from', TextType::class, array(
        'required' => true,
        'label' => 'bookform.place.date_from',
        'constraints' => array($notBlankDateFrom, $dateConstraintFrom),
        'attr' => array(
            'placeholder' => 'bookform.place.date_from',
            'id' => 'bookform_place_date_from',
            'required' => 'required',
        ),
    ));
    ...........
 }

我已经习惯了这种做事方式,它比注释和验证组舒服得多。