2016-03-18 3 views
3

Это первый раз, когда я пытался использовать формы с 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.

ответ

0

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

При отправке данных, подобных мне, по умолчанию 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" 
} 

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

0

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

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

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

+0

Спасибо, я должен был упомянуть, что я уже отключил систему CSRF в целом - также я бы ожидал увидеть ошибку CSRF из вызова getErrors(), если это проблема. –

Смежные вопросы