Доступ до значень 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 (у цьому випадку "ім'я") безпосередньо через об'єкт запиту, наприклад:

$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

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

2
Якщо ви перекрили цю назву getName(), то має сенс не жорсткі коди:$request->request->get($form->getName());
meze

Дякую .. Багато заощадив мого часу :) Вітаю !!
Anjana Silva

38

що працювало для мене, використовую це:

$data = $request->request->all();
$name = $data['form']['name'];

Це те, про що згадував Проблематик, + див. Коментар @meze там
phpsherpa

17

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

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

Також у вас є можливість встановити значення за замовчуванням (другий параметр 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

Я отримую доступ до параметра TickNumber для мого багаточастинного запиту на публікацію наступним чином.

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

1

Я думаю, що для того, щоб отримати дані запиту, пов’язані та перевірені об’єктом форми, ви повинні використовувати:

$form->getClientData();


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

0

Symfony doc для отримання запиту даних

Нарешті, вихідні дані, надіслані разом із тілом запиту, можна отримати за допомогою getContent ():

$ content = $ request-> getContent ();


-14

Якщо ви новачок, ласкаво просимо до Symfony2, проекту з відкритим кодом, тому, якщо ви хочете багато чому навчитися, ви можете відкрити джерело!

З "Form.php":

getData () getNormData () getViewData ()

Більше деталей ви можете знайти у цьому файлі.


Завжди використовуйте спосіб Symfony, $ _POST, $ запит брудний
Thomas Decaux

Так, я не можу пояснити ^^ але це точно таке ж рішення, ніж підтверджене. $form->getData();Я знаю, що люди ледачі і хочуть рішення, не замислюючись трохи ;-(
Томас Деко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.