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

Это первый раз, когда я пытался использовать формы с Symfony, и я полностью застрял. Я уверен, что это будет что-то простое.

У меня есть простой контроллер, настроенный так (с использованием Symfony 2.7 и FOSRestBundle 2.0):

/**
 * @View()
 */
public function postPredictionsAction(Request $request)
{
    $form = $this->createFormBuilder(['id' => '1', 'description' => '2'])
        ->add('id', 'text')
        ->add('description', 'text')
        ->getForm();
    $form->handleRequest($request);

    if ($form->isValid()) {
        return true;
    }

    print_r($request->request->all());
    print_r($form->getData());
    print_r((string) $form->getErrors(true, false));

    return false;
}

Но моя форма всегда недействительна, хотя ошибок нет:

curl -X POST --data 'id=foo&description=bar' http://localhost:8080/bracket/predictions
Array
(
    [id] => foo
    [description] => bar
)
Array
(
    [id] => 1
    [description] => 2
)
false

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

РЕДАКТИРОВАТЬ: после долгих размышлений кажется, что вызов handleRequest() определил, что форма не была отправлена ​​и, следовательно, не проверена, то есть я попадаю в ситуацию, описанную выше.

Поэтому вместо handleRequest() я могу заменить его на submit() в качестве обходного пути. Это описано как устаревшее поведение в документах:

http://symfony.com/doc/2.7/cookbook/form/direct_submit.html#cookbook-form-submit-request

Итак, я явно все еще делаю что-то не так, но я не вижу, что именно, из документации Symfony.


person Andy Raines    schedule 18.03.2016    source источник


Ответы (2)


Я определил, в чем проблема.

При публикации данных, как я, по умолчанию Symfony ожидает, что они будут инкапсулированы в имя формы. Например, с JSON:

{
  "form": {
    "id": "12",
    "name": "abc"
  }
}

Теперь для RESTful API это не то, что я хотел (и я не подозреваю, что большинство людей хотят или ожидают поведения), поэтому вместо этого вы можете сделать следующее в коде:

/**
 * @View()
 */
public function postPredictionsAction(Request $request)
{
    $form = $this->createFormBuilder(['id' => '1', 'description' => '2'])
        ->add('id', 'text')
        ->add('description', 'text')
        ->getForm();

    // NOTE: we use submit here, but pass the data as an array, thus
    // making it Symfony 3 compatible
    $form->submit($request->request->all());

    if ($form->isValid()) {
        // Do valid work
    }

    // Output validation errors
    return $form;
}

И это прекрасно работает со следующим JSON:

{
  "id": "12",
  "name": "abc"
}

Надеюсь, это поможет кому-то еще избежать кроличьей норы, которую я открыл для себя с трудом!

person Andy Raines    schedule 21.03.2016

По умолчанию Symfony встраивает и проверяет токены CSRF автоматически для вас, поэтому ошибка может быть связана с тем, что ваш токен не предоставлен.

Подробнее на:

http://symfony.com/doc/current/book/forms.html#csrf-protection

person João Alves    schedule 18.03.2016
comment
Спасибо, я должен был упомянуть, что уже отключил CSRF для всей системы. Также я ожидал увидеть ошибку CSRF из вызова getErrors(), если бы это было проблемой. - person Andy Raines; 21.03.2016