Я создаю форму поиска по всему сайту, и у меня возникают проблемы с пониманием структуры форм Symfony2, касающейся дочерних форм и обработки ошибок.
Мой код выглядит так:
Тип формы
class SearchType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('q', 'search', array(
'label' => '',
'attr' => array(),
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\SearchQuery',
'csrf_protection' => false,
));
}
public function getName()
{
return 'search_form';
}
}
Сущность (упоминается как data_class
в типе формы выше)
class SearchQuery
{
/**
* @Assert\NotBlank()
* @Assert\Type(type="string", message="form.search.query.validation.type")
* @Assert\Length(
* min = 3,
* max = 50
* )
*/
protected $q;
public function __construct($q = '')
{
$this->setQ($q);
}
public function __toString() {
return $this->getQ();
}
public function getQ()
{
return $this->q;
}
public function setQ($query)
{
$this->q = $query;
}
}
контроллер
$searchForm = $this->createForm(new SearchType());
$searchFormData = array('q' => $q);
$searchForm->submit($searchFormData);
if ($searchForm->isValid()) {
[...]
}
else {
// this returns an empty array regardless there are errors or not
$errors = $searchForm->getErrors();
// this returns errors when they are present
$errorMessages = $searchForm->getErrorsAsString();
}
Вы можете заметить во второй строке кода контроллера, что я отправляю массив, а не SearchQuery
объект. Я пробовал это, и это не очень хорошо, хотя я ожидал, что это будет правильный подход.
Копание документации Symfony и вопросы здесь, на StackOverflow, помогли мне понять, что getErrors()
(увидеть это здесь) никогда не проверяет детские формы и getErrorsAsString()
(увидеть это здесь) делает. Итак, я догадался, что это причина описанного поведения, и поэтому моя форма имела дочернюю форму.
Мой вопрос: почему присутствует детская форма и как от нее избавиться? Что я делаю неправильно?
Спасибо!
Исправлено добавлением error_bubbling
к q
поле в форме типа класса.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('q', 'search', array(
'label' => '',
'attr' => array(),
'error_bubbling' => true,
))
;
}
Других решений пока нет …