Подтвердить что ты не робот

Недопустимая форма Symfony2 без ошибок

У меня проблема с созданной Symfony2 формой CRUD. (С документами MongoDB, но я не думаю, что это связано)

В моем методе createAction() моего контроллера, когда я отлаживаю результат формы:

$form->isValid() // returns false

$form->getErrors() // returns en empty array(0) {}

Итак, я ничего не получаю, используя form_errors(form) в моем шаблоне twig (что кажется нормальным из-за $form->getErrors() пустого возврата)

И записанные значения не заменяются в форме...

Есть ли у кого-нибудь идеи?

4b9b3361

Ответ 1

Первое, что нужно понять, - это проверка на модель, а не на форму. Форма может содержать ошибки, но только если у нее есть поле, сопоставленное с свойством, которое не проверяется. Поэтому, если ваша форма не содержит недопустимое поле (возможно, утверждение NotNull для свойства, которое не находится в форме), оно не покажет ошибку.

Во-вторых, $form->getErrors() будет показывать только ошибки для этого уровня, каждый из которых может содержать свои собственные ошибки. Поэтому, если вы хотите проверить ошибки, вы должны пройти через поля и вызвать getErrors в каждом поле. Метод getErrors в классе Form может обманывать этот путь.

Ответ 2

Чтобы отладить форму, используйте $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 неверен.

Ответ 3

Обновление для Symfony 2.6

Итак, в зависимости от вас версия Symfony2:

die($form->getErrorsAsString());

По , < Функция t21 > устарела (будет удалена в Symfony3), и вы должны использовать следующий метод:

die((string) $form->getErrors());     // Main errors
die((string) $form->getErrors(true)); // Main and child errors

Как , вы можете также используйте функцию dump (dev), если вы активировали DebugBundle:

dump((string) $form->getErrors());     // Main errors
dump((string) $form->getErrors(true)); // Main and child errors

Ответ 4

У меня только такая же проблема. Для меня форма недействительна, но я не мог получить никаких ошибок, используя $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

Ответ 5

Для меня форма не была отправлена, даже если у меня была кнопка отправки. Я добавил код для решения проблемы

$request = $this->get('request');
if($request->isMethod("POST")){
      $form->submit($request);
        if($form->isValid()){
        // now true
        }
}

Ответ 6

Если вы отправляете данные через 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"
       ...
    }
}

Ответ 7

Начиная с Symfony 3 в соответствии с документацией вы должны использовать новую реализацию:

$errors = (string) $form->getErrors(true, false);

Это возвращает все ошибки как одну строку.

Ответ 8

Да это правильно, что он говорит 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;
}

Ответ 9

Я столкнулся с этой ошибкой и обнаружил, что забыл "обработать" запрос. Удостоверьтесь, что у вас это есть...

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()) {
        ...

Ответ 10

Похоже, у вас есть проблема проверки. Форма не подтверждается при отправке. Я собираюсь предположить, что вы используете аннотации для вашей проверки. Убедитесь, что у вас это в верхней части объекта.

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

Ответ 11

Для Symfony ( >= 3.2 - 4) вы можете использовать:

foreach($form->getErrors(true, false) as $er) {
    print_r($er->__toString());
}

чтобы увидеть ошибки.