Symfony2 中同一实体的不同验证规则
Different validation rules on same entity in Symfony2
管理员将能够编辑其网站的用户,但不能编辑密码。所以我创建了这个 EditUserFormType :
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');
但这是绕过约束的糟糕方法...
使用 Validation Groups 区分验证规则。
在这种情况下,注册需要 plainPassword,编辑不需要。
因此,为 NotBlank 约束设置 "registration" 组。
我选择了一种完全不同的方法,放弃了数据模型中类似注释的验证规则,而是使用表单中的约束 类。例如:
/**
* @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',
),
));
...........
}
我已经习惯了这种做事方式,比注解和验证组舒服多了。
管理员将能够编辑其网站的用户,但不能编辑密码。所以我创建了这个 EditUserFormType :
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');
但这是绕过约束的糟糕方法...
使用 Validation Groups 区分验证规则。
在这种情况下,注册需要 plainPassword,编辑不需要。
因此,为 NotBlank 约束设置 "registration" 组。
我选择了一种完全不同的方法,放弃了数据模型中类似注释的验证规则,而是使用表单中的约束 类。例如:
/**
* @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',
),
));
...........
}
我已经习惯了这种做事方式,比注解和验证组舒服多了。