我需要一个简单的用户注册表单。表单验证可以正常工作,但是由回调约束产生的验证错误会因某种原因显示两次。
我在错误消息中插入了一个随机数字,以查看回调是否被调用一次或两次。这2个错误消息显示相同的随机数,因此回调很可能只被调用一次。
非常感谢任何帮助!
额外问题:“所有来自回调函数的错误都在表单的同一位置显示(如预期)。是否(轻松)可以指定应在哪个字段上显示验证错误?”
表单类型类的外观如下:
表单在控制器中的调用方式如下:
我在错误消息中插入了一个随机数字,以查看回调是否被调用一次或两次。这2个错误消息显示相同的随机数,因此回调很可能只被调用一次。
非常感谢任何帮助!
额外问题:“所有来自回调函数的错误都在表单的同一位置显示(如预期)。是否(轻松)可以指定应在哪个字段上显示验证错误?”
表单类型类的外观如下:
class RegisterType extends AbstractType{
static private $em;
static private $translator;
public function __construct( EntityManager $em , TranslatorInterface $translator){
RegisterType::$em = $em;
RegisterType::$translator = $translator;
}
public function buildForm(FormBuilderInterface $builder , array $options){
$builder
->add('email','email',[
'attr'=>['placeholder'=>RegisterType::$translator->trans('your.email')],
'label'=>false ,
'constraints'=>[new NotBlank() , new Assert\Email()]])
->add('password','password',[
'attr'=>['placeholder'=>RegisterType::$translator->trans('your.password')],
'label'=>false ,
'constraints'=>[new NotBlank()]])
->add('confirmPassword','password',[
'attr'=>['placeholder'=>RegisterType::$translator->trans('confirm.password')],
'label'=>false ,
'constraints'=>[new NotBlank()]]);
}
public function getName(){
return 'register';
}
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'constraints' =>array( new Assert\Callback( array('AppBundle\Forms\Type\RegisterType','validateForm' ) )),
));
}
static public function validateForm(array $data, ExecutionContextInterface $context){
if($data['email']){
$user = RegisterType::$em->getRepository('AppBundle:User')->findByEmail($data['email']);
if($user){
$context->buildViolation('email.is.used'.rand())->addViolation();
}
}
if($data['password'] && $data['confirmPassword']){
if($data['password'] != $data['confirmPassword']){
$context->buildViolation('password.confirm.failed')->addViolation();
}
}
}
表单在控制器中的调用方式如下:
public function registerFormAction(Request $request){
$form = $this->createForm('register');
$form->handleRequest($request);
if($form->isValid()){
//TODO
}
return new JsonResponse(['success'=>false,
'message'=>$this->renderView('AppBundle:Security:register.html.twig' , ['form'=>$form->createView()])
]);
}
用于呈现表单的Twig模板为:
{% form_theme form _self %}
{%- block form_row -%}
<div class = "form-group">
{{- form_errors(form) -}}
{{- form_widget(form) -}}
</div>
{%- endblock form_row -%}
{{ form(form) }}
form_label()
,如果你不想渲染它,就不要渲染。但是这样做比操作提供的函数更容易。基本上每个函数只需要再加一行代码。 - KhorneHolyform_rest(form)
是一个很好的技巧。 - lookbadgers