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

93

Хорошо, это вопрос новичка, но я нигде не могу найти ответа. В контроллере в 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, ничего не возвращает. Что я делаю не так? Спасибо!

Акира
источник

Ответы:

99

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 (в данном случае «name») напрямую через объект запроса, например:

$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 () не существует или не задокументировано, когда я задал вопрос.
Acyra 06
4
чтобы привязать данные запроса к форме в новейших версиях, вы должны использовать $ form-> handleRequest ($ request); вместо $ form-> submit ($ request); думаю. Подробнее symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev
127

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

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

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

Проблемный
источник
2
Спасибо. Var_dump помог, я в конечном итоге атаковал это с полным именем, чтобы восстановить данные формы, например, $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra
1
См. Ответ от timaschew ниже, поскольку его спросили, Symfony2 добавил новый метод: $ form-> getData ();
Acyra 06
2
Если вы переопределили getName(), тогда имеет смысл не кодировать имена жестко:$request->request->get($form->getName());
meze
Спасибо .. Сэкономил много времени :) Ура !!
Anjana Silva
38

что сработало для меня, использовало это:

$data = $request->request->all();
$name = $data['form']['name'];
Рамзей
источник
Это то, что упомянул Problematic, + см. Комментарий @meze там
phpsherpa 01
17

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

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

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

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

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

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

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

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

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

метеор
источник
7

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

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
Илькер Балтачи
источник
1

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

$form->getClientData();

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

Symfony документ , чтобы получить данные запроса

Наконец, необработанные данные, отправленные с телом запроса, можно получить с помощью getContent ():

$ content = $ request-> getContent ();

Алекс Джо
источник
-14

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

Из "Form.php":

getData () getNormData () getViewData ()

Вы можете найти более подробную информацию в этом файле.

Томас Деко
источник
Всегда используйте способ Symfony, $ _POST, $ request грязный
Томас Деко
Да, я не умею объяснять ^^, но это точно то же решение, что и подтвержденное, $form->getData();я знаю, что люди ленивы и хотят найти решение, даже не задумываясь ;-(
Thomas Decaux