Доступ к значениям POST в объекте запроса Symfony2

82

ОК, это вопрос новичков, но я не могу найти ответ нигде. В контроллере Symfony2 я хочу получить доступ к значению POST из одной из моих форм. В контроллере я:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

К сожалению, $name_value ничего не возвращает. Что я делаю не так? Благодарю!

Теги:
http-post

8 ответов

82
Лучший ответ

Symfony 2.2

это решение устарело с 2.3 и будет удалено в 3.0, см. документацию

$form->getData();

дает массив для параметров формы

из книга symfony2 стр. 162 (Глава 12: Формы)

[...] иногда, вы можете просто хотеть использовать форму без класса и возвращать массив представленных данные. Это действительно очень просто:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

Вы также можете получить доступ к значениям POST (в данном случае "имя" ) непосредственно через объект запроса, например:

$this->get('request')->request->get('name');

Следует иметь в виду, что в большинстве случаев использование метода getData() является лучшим выбором, поскольку оно возвращает данные (обычно объект) после того, как он был преобразован каркасом формы.

Если вы хотите получить доступ к токену формы, вы должны использовать ответ Problematic $postData = $request->request->get('contact');, потому что getData() удаляет элемент из массива


Symfony 2.3

начиная с 2.3, вы должны использовать handleRequest вместо bindRequest:

 $form->handleRequest($request);

см. документацию

  • 4
    Это здорово, и теперь это лучший ответ. $ form-> getData () не существовало или не было задокументировано, когда я задал вопрос.
  • 4
    чтобы связать данные запроса с формой в новейших версиях, вы должны использовать $ form-> handleRequest ($ request); вместо $ form-> submit ($ request); Я думаю. Подробнее symfony.com/doc/2.3/book/forms.html#handling-form-submissions
117

Значения даты формы сохраняются под именем формы в запросе. Например, если вы переопределили метод getName() метода ContactType(), чтобы вернуть "контакт", вы должны сделать следующее:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

Если у вас все еще есть проблемы, попробуйте сделать var_dump() on $request->request->all(), чтобы увидеть все значения post.

  • 2
    Спасибо. Помогла переменная var_dump, в итоге я атаковал ее полным именем, чтобы восстановить данные формы, например, $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
  • 1
    Смотрите ответ от timaschew ниже, так как это было задано, Symfony2 добавил новый метод: $ form-> getData ();
Показать ещё 2 комментария
37

что сработало для меня, было это:

$data = $request->request->all();
$name = $data['form']['name'];
  • 0
    Это то, что упомянул проблематично, + см. Комментарий @meze там
16

Существует один трюк с методом ParameterBag::get(). Вы можете установить $deep параметр на true и получить доступ к требуемому глубокому вложенному значению без дополнительной переменной:

$request->request->get('form[some][deep][data]', null, true);

Также у вас есть возможность установить значение по умолчанию (2-й параметр метода get()), он может избежать избыточного вызова isset($form['some']['deep']['data']).

  • 0
    Третий параметр устарел и удален из 3.0. Примечание. Поиск более глубоких элементов не рекомендуется с версии 2.8 и будет удален в 3.0. : github.com/symfony/symfony/blob/…
8

Доступ к данным полей можно получить в контроллере с: Листинг 12-34

$form->get('dueDate')->getData();

Кроме того, данные немаркированного поля также могут быть изменены непосредственно: Листинг 12-35

$form->get('dueDate')->setData(new \DateTime());

стр. 164 Книга symfony2 (сгенерирована 9 октября 2013 г.)

1

Я думаю, что для получения данных запроса, связанных и проверенных объектом формы, вы должны использовать:

$form->getClientData();

  • 7
    getClientData устарела. Используйте getData, getViewData, getNormData .... Компонент Form в SF2 очень грязный (они действительно должны вдохновляться миром Java и классным RequestDataBinder ....)
0

Я получаю доступ к параметру ticketNumber для моего многостраничного почтового запроса следующим образом.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
-13

Если вы новичок, добро пожаловать в Symfony2, проект с открытым исходным кодом, поэтому, если вы хотите многому научиться, вы можете открыть источник!

От "Form.php":

GetData() getNormData() getViewData()

Подробнее вы можете найти в этом файле.

  • 0
    Всегда используйте способ Symfony, $ _POST, $ request грязный
  • 0
    хаха этот ответ не имеет никакого смысла :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню