Я сделал тип поля captcha, который показывает изображения captcha пользователям.
Я хочу проверить, является ли пользователь правильным или нет в моем настраиваемом типе поля (самооценка в настраиваемом поле).
Мой тип поля:
<?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 }
Это отлично работает, когда мы вызываем из любого типа формы.
Теперь я должен проверить, что данные формы соответствуют значению session captcha в моем настраиваемом типе поля.
Как я могу это сделать?
Спасибо!
Полное решение:
<?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 }
Добавьте это в свой FormType, чтобы добавить валидатор.
public function buildForm(FormBuilderInterface $builder, array $options) {
$validator = new CustomValidator();
$builder->addEventListener(FormEvents::POST_BIND, array($validator, 'validate'));
}