Ошибки доступа в контроллере Symfony2 для отправленной формы AJAX - PullRequest
6 голосов
/ 06 ноября 2011

Задача 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?

Ответы [ 2 ]

7 голосов
/ 07 ноября 2011

Задача 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,
    ),
  )),
) [] []

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

4 голосов
/ 07 ноября 2011

Задача 1

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

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

Задача 2

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

...