Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ed209Ответов: 2

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

phpsymfonydoctrine-orm

Ответы

Ответ 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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы