У меня проблема с созданной Symfony2 формой CRUD. (С документами MongoDB, но я не думаю, что это связано)
В моем методе createAction() моего контроллера, когда я отлаживаю результат формы:
$form->isValid() // returns false
$form->getErrors() // returns en empty array(0) {}
Итак, я ничего не получаю, используя form_errors(form)
в моем шаблоне twig (что кажется нормальным из-за $form->getErrors()
пустого возврата)
И записанные значения не заменяются в форме...
Есть ли у кого-нибудь идеи?
Первое, что нужно понять, - это проверка на модель, а не на форму. Форма может содержать ошибки, но только если у нее есть поле, сопоставленное с свойством, которое не проверяется. Поэтому, если ваша форма не содержит недопустимое поле (возможно, утверждение NotNull
для свойства, которое не находится в форме), оно не покажет ошибку.
Во-вторых, $form->getErrors()
будет показывать только ошибки для этого уровня, каждый из которых может содержать свои собственные ошибки. Поэтому, если вы хотите проверить ошибки, вы должны пройти через поля и вызвать getErrors в каждом поле. Метод getErrors
в классе Form может обманывать этот путь.
Чтобы отладить форму, используйте $form->getErrorsAsString()
вместо $form->getErrors()
.
$form->getErrorsAsString()
должен использоваться только для отладки формы... он будет содержать ошибки каждого дочернего элемента, что не относится к $form->getErrors()
.
Как упоминает Питер, $form->getErrors()
не вернет сумму всех ошибок дочерних форм.
Чтобы понять, как форма может быть недействительной и иметь getErrors(), возвращающую пустой массив, вы можете взглянуть на isValid() метод symfony класс формы. Как вы можете видеть, есть два случая, когда форма недействительна, первый тест для общей формы и второй случайный тест для каждого дочернего элемента.
public function isValid()
{
//...
//CASE I : IF CHILD ELEMENTS HAVE ERRORS, $this->errors WILL CONTAIN
//THE ERROR ON THE CHILD ELEMENT AND NOT ON THE GENERAL 'errors' FIELD
//ITSELF
if (count($this->errors) > 0) {
return false;
}
//CASE II: AND THIS IS WHY WE ARE TESTING THE CHILD ELEMENTS AS WELL
//TO CHECK WHETHER THERE ARE VALID OR NOT
if (!$this->isDisabled()) {
foreach ($this->children as $child) {
if (!$child->isValid()) {
return false;
}
}
}
return true;
}
Поэтому каждый ребенок формы может содержать ошибку, но $form->getErrors()
сам не вернет все ошибки. Учитывая форму, которая имеет много дочерних элементов, вы обычно имеете $form- > getErrors() с ошибкой CSRF, если CSRF неверен.
Обновление для Symfony 2.6
Итак, в зависимости от вас версия Symfony2:
die($form->getErrorsAsString());
По symfony2.5, < Функция t21 > устарела (будет удалена в Symfony3), и вы должны использовать следующий метод:
die((string) $form->getErrors()); // Main errors
die((string) $form->getErrors(true)); // Main and child errors
Как symfony2.6, вы можете также используйте функцию dump
(dev), если вы активировали DebugBundle
:
dump((string) $form->getErrors()); // Main errors
dump((string) $form->getErrors(true)); // Main and child errors
У меня только такая же проблема. Для меня форма недействительна, но я не мог получить никаких ошибок, используя $form->getErrors()
или $form->getErrorsAsString()
. Позже я обнаружил, что забыл передать токен CSRF в форму, чтобы он не был отправлен, а $form->handleRequest($request)
ничего не сделал (без проверки). Когда я увидел ответ @pit, я попытался использовать
$form->submit($request);
$form->getErrorsAsString();
он возвратил ошибку:
ОШИБКА: токен CSRF недопустим. Повторите отправку формы.
Вот несколько пояснений в документации Symfony2: http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Для меня форма не была отправлена, даже если у меня была кнопка отправки. Я добавил код для решения проблемы
$request = $this->get('request');
if($request->isMethod("POST")){
$form->submit($request);
if($form->isValid()){
// now true
}
}
Начиная с Symfony 3 в соответствии с документацией вы должны использовать новую реализацию:
$errors = (string) $form->getErrors(true, false);
Это возвращает все ошибки как одну строку.
Если вы отправляете данные через AJAX, возможно, вы пропустили включение имени формы в свои ключи данных и, следовательно, являются "жертвой"...
# line 100 of Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php
// Don't submit the form if it is not present in the request
Это означает, что при попытке обработать запрос механизм обработки запроса не нашел ваше имя формы внутри данных GET/POST (что означает как массив).
При визуализации формы обычным способом каждое из своих полей содержит ваше имя формы в качестве префикса в свой атрибут name my_form[child_field_name]
.
При использовании ajax добавьте свое имя формы в качестве префикса в данные!
data : {
"my_form" : {
"field_one" : "field_one_value"
...
}
}
Я столкнулся с этой ошибкой и обнаружил, что забыл "обработать" запрос. Удостоверьтесь, что у вас это есть...
public function editAction(Request $request)
{
$form = $this->createForm(new CustomType(),$dataObject);
/** This next line is the one I'm talking about... */
$form->handleRequest($request);
if ($request->getMethod() == "POST") {
if ($form->isValid()) {
...
Да это правильно, что он говорит Peter Kruithof В SF 2.8 это моя функция, чтобы получить ошибки полей
private function getErrorsForm(\Symfony\Component\Form\Form $form)
{
$response = array();
foreach ($form as $child) {
foreach ($child->getErrors(true) as $error) {
$response[$child->getName()][] = $error->getMessage();
}
}
return $response;
}
Для Symfony ( >= 3.2 - 4) вы можете использовать:
foreach($form->getErrors(true, false) as $er) {
print_r($er->__toString());
}
чтобы увидеть ошибки.
__toString()
напрямую. Проще непосредственно привести объект в строку, как уже предлагал Адам.
Похоже, у вас есть проблема проверки. Форма не подтверждается при отправке. Я собираюсь предположить, что вы используете аннотации для вашей проверки. Убедитесь, что у вас это в верхней части объекта.
use Symfony\Component\Validator\Constraints as Assert;
а также это выше каждого свойства
/**
* @Assert\NotBlank()
*/
NotBlank()
можно изменить на любое ограничение, соответствующее вашим потребностям.
Более подробную информацию о проверке можно найти по адресу: http://symfony.com/doc/current/book/validation.html
Дополнительную информацию о ограничениях Assert можно найти по адресу: http://symfony.com/doc/current/book/validation.html#constraints