#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.