2014-12-05 86 views
0

我做了一個驗證碼字段類型,向用戶顯示驗證碼圖像。Symfony2提交時自定義字段類型和表單事件

我想檢查用戶是否正確或不在我的自定義字段類型(自定義字段上的自我驗證)。

我的字段類型:

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

現在我要驗證表單數據,在我的自定義字段類型的會話驗證碼值匹配。

我該怎麼做?

謝謝!

回答

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

將此添加到您的FormType以添加驗證程序。

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

你的答案是好的,但還不夠好。我自己做了,並會發布並回答:) buildForm的+1 – 2014-12-05 14:18:44