【问题标题】:Symfony2 Custom Field Type and Form Events on SubmitSymfony2 自定义字段类型和提交时的表单事件
【发布时间】:2014-12-05 13:45:47
【问题描述】:

我制作了一个向用户显示验证码图像的验证码字段类型。

我想检查用户在我的自定义字段类型上是否正确(自定义字段的自我验证)。

我的字段类型:

<?php
namespace CS\CommonBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CaptchaType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array('mapped' => false));
    }

    public function getParent()
    {
        return 'text';
    }

    public function getName()
    {
        return 'captcha';
    }
}

我的服务:

cs_common.form.type.captcha:
    class: CS\CommonBundle\Form\Type\CaptchaType
    tags:
        - { name: form.type, alias: captcha }

当我们从任何表单类型调用时,这都能正常工作。

现在我必须验证表单数据是否与我的自定义字段类型中的会话验证码值匹配。

我该怎么做?

谢谢!

【问题讨论】:

    标签: php forms validation symfony


    【解决方案1】:

    将此添加到您的 FormType 以添加验证器。

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $validator = new CustomValidator();
        $builder->addEventListener(FormEvents::POST_BIND, array($validator, 'validate'));
    }
    

    【讨论】:

    • 您的回答很好,但还不够好。我自己做的,会发帖并回答:) +1 for buildForm
    【解决方案2】:

    完整的解决方案:

    <?php
    namespace CS\CommonBundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormError;
    use Symfony\Component\HttpFoundation\Session\Session;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\Form\FormEvent;
    
    class CaptchaType extends AbstractType
    {
        private $session;
    
        public function __construct(Session $session)
        {
            $this->session = $session;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
                $form = $event->getForm();
                $captcha_value = $form->getData();
    
                if($captcha_value !== $this->session->get('captcha')) {
                    $form->addError(new FormError('Doğrulama Kodu Yanlış!'));
                }
            });
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array('mapped' => false));
        }
    
        public function getParent()
        {
            return 'text';
        }
    
        public function getName()
        {
            return 'captcha';
        }
    }
    

    别忘了更新服务:

    cs_common.form.type.captcha:
        class: CS\CommonBundle\Form\Type\CaptchaType
        arguments:
            session: "@session"
        tags:
            - { name: form.type, alias: captcha }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多