Вот мой saveAction
код (где форма передает данные)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
У меня вопрос: как мне получить сообщение об ошибке при $form->isValid()
возврате false
?
error_bubbling
значение true в вашем типе формы, явно установив параметр для каждого поля.$form->getErrors(true)
можете включить ошибки дочерних формSymfony 2.3 / 2.4:
Эта функция получает все ошибки. Те, которые указаны в форме, такие как «Токен CSRF недействителен. Попробуйте повторно отправить форму». а также дополнительные ошибки в дочерних формах, у которых нет пузырей ошибок.
Чтобы получить все ошибки в виде строки:
Symfony 2.5 / 3.0:
Документы:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (на дно:
The method Form::getErrorsAsString() was removed
)источник
$errors[$child->getName()] = $this->getErrorMessages($child);
исключение, поскольку getErrorMessages отсутствовало в компоненте Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller . Поэтому я заменил его на$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
и думал, что он вызывается непосредственно внутри контроллера и является частью Symfony api.Ниже приведено решение, которое сработало для меня. Эта функция находится в контроллере и возвращает структурированный массив всех сообщений об ошибках и поля, вызвавшего их.
Symfony 2.0:
Symfony 2.1 и новее:
источник
$this->getFormErrors
должна быть опечатка$this->getErrorMessages
Используйте валидатор, чтобы получить ошибки для определенного объекта
Справка по API:
источник
Чтобы получить правильные (переводимые) сообщения, в настоящее время использующие SF 2.6.3, вот моя последняя функция (поскольку ни одна из вышеперечисленных, похоже, больше не работает):
поскольку метод Form :: getErrors () теперь возвращает экземпляр FormErrorIterator , если вы не переключите второй аргумент ($ flatten) на true . (Затем он вернет экземпляр FormError , и вам нужно будет вызвать метод getMessage () напрямую, без метода current ():
)
Самое главное - установить для первого аргумента значение true, чтобы получать ошибки. Если оставить для второго аргумента ($ flatten) значение по умолчанию ( true ), будут возвращены экземпляры FormError , тогда как он вернет FormErrorIterator. при установке значения false - экземпляры .
источник
Для моих флеш-сообщений я был доволен
$form->getErrorsAsString()
Изменить (от Benji_X80): для использования SF3
$form->getErrors(true, false);
источник
This method should only be used to help debug a form.
( источник )Функция для Symfony 2.1 и новее, без устаревшей функции:
источник
IF
утверждения? Почему это взаимоисключающие? Насколько я понимаю: у формы могут быть как собственные ошибки, так и дочерние.Переведенные сообщения об ошибках формы (Symfony2.1)
Я много пытался найти эту информацию, поэтому я думаю, что определенно стоит добавить примечание о переводе ошибок формы.
@Icode4food
ответ вернет все ошибки формы. Однако возвращаемый массив не принимает во внимание плюрализацию сообщения или перевод. .Вы можете изменить цикл
@Icode4food
ответа foreach, чтобы получить комбо:Вот:
Этот ответ был составлен из 3 разных сообщений:
источник
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Я подозреваю, что это только для Symfony 2.1?SYMFONY 3.X
Другие методы SF 3.X, приведенные здесь, у меня не работали, потому что я мог отправлять в форму пустые данные (но у меня есть ограничения NotNull / NotBlanck). В этом случае строка ошибки будет выглядеть так:
Что не очень полезно. Итак, я сделал это:
Что вернет это:
источник
Вы также можете использовать службу валидатора, чтобы получить нарушения ограничений:
источник
Переведенные сообщения об ошибках формы (Symfony2.3)
Мой вариант решения проблемы:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
В Symfony 2.5 вы можете легко получить все ошибки полей:
источник
Для Symfony 3.2 и выше используйте это,
Используйте str_replace, если хотите избавиться от надоедливого текста « Ошибка: » в каждом тексте описания ошибки.
источник
Если вы используете собственные валидаторы, Symfony не возвращает ошибки, сгенерированные этими валидаторами в
$form->getErrors()
.$form->getErrorsAsString()
вернет все необходимые ошибки, но, к сожалению, его вывод отформатирован как строка, а не как массив.Метод, который вы используете для получения всех ошибок (независимо от их происхождения), зависит от того, какую версию Symfony вы используете.
Большинство предлагаемых решений включают создание рекурсивной функции, которая просматривает все дочерние формы и извлекает соответствующие ошибки в один массив. В Symfony 2.3 этой
$form->hasChildren()
функции нет, но она есть$form->all()
.Вот вспомогательный класс для Symfony 2.3, который вы можете использовать для извлечения всех ошибок из любой формы. (Он основан на коде из комментария yapro к сообщению об ошибке в аккаунте Symfony на github.)
Телефонный код:
источник
Основываясь на ответе @Jay Seth, я сделал версию класса FormErrors специально для Ajax Forms:
Использование (например, в вашем действии):
Версия Symfony: 2.8.4
Пример ответа JSON:
Объект ошибки содержит «ключевое» поле, которое является идентификатором входного элемента DOM, поэтому вы можете легко заполнить сообщения об ошибках.
Если у вас есть дочерние формы внутри родительской, не забудьте добавить
cascade_validation
параметр внутри родительской формыsetDefaults
.источник
Для Symfony 2.1 и более поздних версий для использования с отображением ошибок Twig я изменил функцию, чтобы добавить FormError вместо простого их извлечения, таким образом у вас будет больше контроля над ошибками и вам не нужно использовать error_bubbling для каждого отдельного ввода. Если вы не установите его указанным ниже способом, {{form_errors (form)}} останется пустым:
источник
$ form-> getErrors () у меня работает.
источник
Я придумал это решение. Он отлично работает с последней версией Symfony 2.4 .
Я постараюсь дать некоторые пояснения.
Использование отдельного валидатора
Я считаю плохой идеей использовать отдельную проверку для проверки сущностей и возврата сообщений о нарушении ограничений, как это предлагают другие авторы.
Вам нужно будет вручную проверить все сущности, указать группы проверки и т. Д. И т. Д. Со сложными иерархическими формами это вообще непрактично и быстро выйдет из-под контроля.
Таким образом, вы будете проверять форму дважды: один раз с формой и один раз с отдельным валидатором. Это плохая идея с точки зрения производительности.
Я предлагаю рекурсивно перебирать тип формы с его дочерними элементами для сбора сообщений об ошибках.
Использование некоторых предложенных методов с эксклюзивным оператором IF
Некоторые ответы, предложенные другими авторами, содержат взаимоисключающие операторы IF, например:
if ($form->count() > 0)
илиif ($form->hasChildren())
.Насколько я понимаю, в любой форме могут быть не только дочерние элементы, но и ошибки. Я не разбираюсь в компоненте Symfony Forms , но на практике вы не получите некоторых ошибок самой формы, таких как ошибка защиты CSRF или дополнительные поля. . Предлагаю убрать это разделение.
Использование денормализованной структуры результатов
Некоторые авторы предлагают помещать все ошибки в простой массив. Таким образом, все сообщения об ошибках самой формы и ее дочерних элементов будут добавлены в один и тот же массив с разными стратегиями индексации: на основе чисел для собственных ошибок типа и на основе имен для ошибок дочерних элементов. Предлагаю использовать нормализованную структуру данных вида:
Таким образом, результат можно будет легко повторить позже.
Мое решение
Итак, вот мое решение этой проблемы:
Надеюсь, это кому-то поможет.
источник
СИМФОНИЯ 3.1
Я просто реализовал статический метод для обработки отображения ошибок
Надеюсь помочь
источник
Symfony 3 и новее
Недавно я создал функцию, которая создает дерево ошибок формы. Это будет полезно для возврата списка ошибок во внешний интерфейс. Это основано на типах форм, имеющих:
Код:
Вывод:
Примечание : я знаю, что ошибки из полей более глубокого уровня могут быть перезаписаны, если на более высоком уровне есть ошибки, но это сделано специально для моего использования.
источник
Для Symfony 2.1:
Это мое окончательное решение, объединяющее многие другие решения:
источник