Symfony2 формирует детей и ошибки

Я создаю форму поиска по всему сайту, и у меня возникают проблемы с пониманием структуры форм 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() (увидеть это здесь) делает. Итак, я догадался, что это причина описанного поведения, и поэтому моя форма имела дочернюю форму.

Мой вопрос: почему присутствует детская форма и как от нее избавиться? Что я делаю неправильно?

Спасибо!

1

Решение

Исправлено добавлением error_bubbling к q поле в форме типа класса.

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('q', 'search', array(
'label' => '',
'attr' => array(),
'error_bubbling' => true,
))
;
}
0

Другие решения

Других решений пока нет …