提交时的Symfony2自定义字段类型和表单事件

时间:2014-12-05 13:45:47

标签: php forms validation symfony

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

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

我的字段类型:

<?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 }

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

enter image description here

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

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

完整解决方案:

<?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 }