Ответ 1
Этот пост не обновляется с помощью Symfony 2.3
прочитать комментарии ниже
Запускается новая версия!
Проверка не отображаемых полей в форме (Symfony 2.1.2)
Это глобальный ответ для некоторых вопросов stackoverflow о текущем способе проверки неограниченного или не отображаемого поля в формах.
- валидация в поле несвязанной формы
- как добавить проверку на несвязанное поле формы в symfony2
- больше....
Богатая экосистема Symfony 2 делает нашу систему выбора быстро развивающимся инструментом.
Версия Symfony 2.1 приносит много неудобств. Это означает, что то, что работает с Symfony 2.0 до 2.1.2, больше не будет работать в Symfony 2.3.
Для получения дополнительной информации об этом читайте UPGRADE FROM Symfony 2.0 до 2.1 и читайте @deprecated комментарии в коде Symfony.
Невязанные поля
При создании формы обычно используются сущности, и ваша валидация может быть сделана в базах Entity для аннотаций проверки.
namespace Dj\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Dj\TestBundle\Entity\Post
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Dj\TestBundle\Entity\PostRepository")
*/
class Post
{
// ... some code
/**
* @var string $title
* @ORM\Column(name="title", type="string", length=200, nullable=false)
* @Assert\NotBlank()
*/
private $title;
// .. getters and setters
}
Но иногда (часто) вам нужно вставить некоторые поля в вашу форму, которые не сопоставляются с моделью.
Наш пример модели выглядит следующим образом:
namespace Dj\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Dj\TestBundle\Entity\Post
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Dj\TestBundle\Entity\PostRepository")
*/
class Post
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**ghjkl
* @var string $title
* @ORM\Column(name="title", type="string", length=200, nullable=false)
* @Assert\NotBlank()
*/
private $title;
// ... getters and setters
}
Если мы хотим добавить дополнительное поле с именем myExtraField в нашу форму:
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title')
->add('myExtraField', 'choice', array(
'label' => 'myExtraField option :',
'choices' => array(
1 => 'Option One',
2 => 'Option Wat !'
),
'expanded' => true,
'mapped' => false
));
}
// other methods
}
Примечание:
- сопоставлено заменяет property_path, который будет устаревшим в Symfony 2.3
- вы можете добавить выбранное значение по умолчанию в myExtraField, добавив в массив параметров 'data' = > 1.
Пример кода:
$builder->add('title')
->add('myExtraField', 'choice', array(
'label' => 'myExtraField option :',
'choices' => array(
1 => 'Option One',
2 => 'Option Wat !'
),
'data' => 1, // default selected option
'expanded' => true,
'mapped' => false
));
Если вы хотите проверить поле myExtraField, вы не можете сделать это в аннотации Post Entity, вы должны сделать это в своей форме.
Неверное поле проверки достоверности - путь Symfony 2.0
2.0 способ состоял в том, чтобы добавить валидатор в конструктор форм ($ builder- > addValidator (..)), но этот метод устарел!
namespace Dj\TestBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
// needed namespaces for 2.0 validation
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormError;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ... $builder->add()
// VALIDATING NON MAPPED FIELD Symfony 2.0 way
/** @var Symfony\Component\Form\CallbackValidator $myExtraFieldValidator **/
$myExtraFieldValidator = new CallbackValidator(function(FormInterface $form){
$myExtraField = $form->get('myExtraField')->getData();
if (empty($myExtraField)) {
$form['myExtraField']->addError(new FormError("myExtraField must not be empty"));
}
});
// adding the validator to the FormBuilderInterface
$builder->addValidator($myExtraFieldValidator);
}
// ... other methods
}
В настоящее время мы проверяем поле myExtraField, НО $builder- > addValidator умрет в Symfony 2.3!
Код, совместимый с Forward
Как указано в ОБНОВЛЕНИЕ ОТ Symfony 2.0 до 2.1, поскольку FormValidatorInterface устарел, теперь мы должны передать нашу функцию закрытия проверки на прослушиватель событий, связанный с событием FormEvents:: POST_BIND.
Это код.
namespace Dj\TestBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
// needed namespaces for 2.1 validation
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormError;
class PostType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ... $builder->add()
// VALIDATING NON MAPPED FIELD Symfony 2.1.2 way (and forward)
/** @var \closure $myExtraFieldValidator **/
$myExtraFieldValidator = function(FormEvent $event){
$form = $event->getForm();
$myExtraField = $form->get('myExtraField')->getData();
if (empty($myExtraField)) {
$form['myExtraField']->addError(new FormError("myExtraField must not be empty"));
}
};
// adding the validator to the FormBuilderInterface
$builder->addEventListener(FormEvents::POST_BIND, $myExtraFieldValidator);
}
// ... other methods
}
Это, безусловно, может быть улучшено с помощью некоторой справки Sf gurus, но на данный момент он проверяет несвязанное поле формы на совместимом с ним способом.
Надеюсь, что это поможет оттолкнуть некоторых из нас.
Дэвид