Проблема 1
Я хотел бы создать регистрационную форму с помощью отправки ajax. Регистрационные работы $form->isValid(). Однако, если форма не регистрируется, мне нужно вернуть эти ошибки через ajax.
if ($form->isValid()) {
}else{
$errors = $form->getErrors();
// return some json encoded errors here
}
$form->getErrors() возвращает пустой массив, даже если форма не прошла проверку (в этом случае я тестирую слишком короткое имя пользователя).
Проблема 2
Вторая проблема, с которой я сталкиваюсь, заключается в том, что если форма проверяется, но все еще возникает ошибка. Например, уникальное поле, для которого кто-то пытается отправить одно и то же значение.
if ($form->isValid()) {
$em = $this->getDoctrine()->getEntityManager();
$em->persist($form->getData());
$em->flush();
// error could be a username submitted more than once, username is unique field
}else{
// ...
}
Как я могу поймать эту ошибку и вернуть ее через json?
Ответ 1 · рейтинг 7 · ed209
Проблема 1
В построителе форм вы можете использовать error_bubbling для перемещения ошибок в объект формы. Когда вы указываете поле, передайте его как опцию, например:
$builder->add('username','text', array('error_bubbling'=>true));
и вы можете получить доступ к ошибкам в вашем объекте формы следующим образом:
$form->getErrors();
Выводит что-то вроде
array (
0 =>
Symfony\Component\Form\FormError::__set_state(array(
'messageTemplate' => 'Your username must have at least {{ limit }} characters.',
'messageParameters' =>
array (
'{{ value }}' => '1',
'{{ limit }}' => 2,
),
)),
) [] []
к вашему сведению: если вы используете Form/Type, вы не можете установить error_bubbling в качестве значения по умолчанию, оно должно быть назначено каждому полю.
Полезная ссылка: http://symfony.com/doc/2.0/reference/forms/types/text.html#error-bubbling
Проблема 2
http://symfony.com/doc/2.0/reference/constraints/UniqueEntity.html
Ответ 2 · рейтинг 4 · Magnus Nordlander
Проблема 1
Ошибки не в самой форме. Form::getErrors будет возвращать ошибки только в том случае, если они есть в самом объекте формы. Вам нужно просмотреть форму и проверить наличие ошибок в каждом дочернем элементе.
Form::isValid наоборот, просто обходит дочерние элементы и проверяет, не являются ли они недействительными.
Проблема 2
Если после проверки все еще есть "ошибки", это означает, что ваша проверка не завершена. Если вашему приложению требуется нестандартное ограничение, вы должны просто написать собственное ограничение. Дополнительную информацию см. в в поваренной книге о написании пользовательских ограничений валидатора .