Ошибки доступа в контроллере Symfony2 для отправленной формы AJAX

Проблема 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?


person ed209    schedule 06.11.2011    source источник


Ответы (2)


Проблема 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

person ed209    schedule 07.11.2011

Проблема 1

Ошибки не в самой форме. Form::getErrors будет возвращать ошибки только в том случае, если они есть в самом объекте формы. Вам нужно просмотреть форму и проверить наличие ошибок в каждом дочернем элементе.

Form::isValid наоборот, просто обходит дочерние элементы и проверяет, не являются ли они недействительными.

Проблема 2

Если после проверки все еще есть «ошибки», это означает, что ваша проверка не завершена. Если вашему приложению требуется нестандартное ограничение, вы должны просто написать собственное ограничение. Дополнительную информацию см. в в поваренной книге о написании пользовательских ограничений валидатора .

person Magnus Nordlander    schedule 06.11.2011
comment
Как валидатор узнает, что кто-то уже использовал это имя пользователя в таблице? Я думал, что валидатор проверяет, верны ли эти данные, а не существуют ли они уже, или он делает и то, и другое? - person ed209; 07.11.2011
comment
Валидатор может выполнять любой тип проверки, для которого вы его кодируете. Конечно, как уже отмечалось, уже существует валидатор уникальности UniqueEntity. - person Magnus Nordlander; 08.11.2011