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

#php #doctrine-orm #symfony

#php #doctrine-orm #symfony

Вопрос:

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

Проблема 1

В вашем конструкторе форм вы можете использовать error_bubbling для перемещения ошибок в ваш объект формы. Когда вы укажете поле, передайте его в качестве опции, подобной этой:

 $builder->add('username','text', array('error_bubbling'=>true));
  

и вы можете получить доступ к ошибкам в вашем объекте формы следующим образом:

 $form->getErrors();
  

Выводит что-то вроде

 array (
  0 => 
  SymfonyComponentFormFormError::__set_state(array(
     'messageTemplate' => 'Your username must have at least {{ limit }} characters.',
     'messageParameters' => 
    array (
      '{{ value }}' => '1',
      '{{ limit }}' => 2,
    ),
  )),
) [] []
  

к вашему сведению: если вы используете форму / тип, которые вы не можете установить 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:

Проблема 1

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

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

Проблема 2

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

Комментарии:

1. Как валидатор узнает, что кто-то уже использовал это имя пользователя в таблице? Я думал, что валидатор проверил правильность этих данных, а не то, существуют ли эти данные уже, или он делает и то, и другое?

2. Валидатор может выполнять любой тип проверки, для которого вы его кодируете. Конечно, как было отмечено, уже есть средство проверки уникальности, UniqueEntity.