Як отримати значення форми в контролері Symfony2


81

Я використовую форму для входу на Symfony2 із таким кодом контролера

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

Але я отримую таке попередження:

Попередження: array_replace_recursive () [function.array-replace-rekurzivno]: Аргумент # 1 не є масивом у \ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php рядок 593 500 Внутрішня помилка сервера - ErrorException

Хтось може допомогти мені зрозуміти, що неправильно, і як я можу це виправити? Дякую.

Оновлення: файл twig приблизно такий:

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

Ось функція у Тип форми

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

Ось маршрут:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}

Відповіді:


99

Просто:

$data = $form->getData();

1
Приємна відповідь - RE: відповіді нижче. Symfony часто пропонує багато способів отримати подібні результати. Завжди корисно досліджувати "Найкращі практики", коли шукаєте рішення SF.
JustinP

8
Для нових версій: $ data = $ form-> all ();
Gmajoulet

92

Жодне з перерахованого не працювало для мене. Це працює для мене:

$username = $form["username"]->getData();
$password = $form["password"]->getData();

Сподіваюся, це допоможе.


2
Хммм дивно, я працюю з $ request-> request-> get ('username'); Ви передали об'єкт запиту як параметр дії? І вам також потрібно включити клас запитів до вищезазначеного.
VishwaKumar

59

У Symfony 2 (точніше, версія 2.3) ви можете отримати дані поля за

$var = $form->get('yourformfieldname')->getData();

або ви можете отримати всі дані надіслані

$data = $form->getData();

де '$ data' - це масив, що містить значення полів форми.


20

У Symfony> = 2.3 ви можете отримати значення окремих полів за допомогою:

$var = $form->get('yourformfieldname')->getData();

З іншого боку, ви можете використовувати:

$data = $form->getData();

АЛЕ це отримало б дві різні речі:

  • сутність зі значеннями, заповненими формою, якщо у вашій формі data-classвключений параметр (тому вона прив’язана до сутності); це виключить будь-яке поле з 'mapping' => falseопцією

  • в іншому випадку масив з усіма полями форми


18

Якщо у вас є додаткові поля у формі, яка не визначена в Entity, $form->getData()не працює, одним із способів може бути такий:

$request->get("form")["foo"] 

Або:

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

Дякую! Ти врятував мій день!

Дякую! Це дуже допомогло.
madshvero

якщо вам потрібен ідентифікатор запиту, якщо це об’єкт, ви можете виконати таку команду: $ form-> get ('foo') -> getData () -> getId ();
juanitourquiza

Дуже цінуємо вашу відповідь, це було дуже корисно.
Іван Франко

5

У формах Symfony є два різні типи трансформаторів і три різні типи базових даних: введіть тут опис зображення У будь-якій формі три різні типи даних:

  • Дані моделі

    Це дані у форматі, що використовується у вашому додатку (наприклад, об’єкт Issue). Якщо ви телефонуєте Form::getData()або Form::setData(), ви маєте справу з даними "моделі".

  • Дані норми

    Це нормалізована версія ваших даних, яка зазвичай збігається з вашими "модельними" даними (хоча не в нашому прикладі). Він зазвичай не використовується безпосередньо.

  • Переглянути дані

    Це формат, який використовується для заповнення самих полів форми. Це також формат, у якому користувач подаватиме дані. Коли ви телефонуєте Form::submit($data), дані $ знаходяться у форматі даних "view".

Два різні типи трансформаторів допомагають перетворювати дані та з кожного з цих типів даних:

  • Модельні трансформатори :

    transform(): "дані моделі" => "дані норми"
    reverseTransform(): "дані норми" => "дані моделі"

  • Вигляд трансформаторів :

    transform(): "norma data" => "view data"
    reverseTransform(): "переглянути дані" => "norm data"

Який трансформатор вам потрібен, залежить від вашої ситуації.

Щоб скористатися трансформатором вигляду, зателефонуйте addViewTransformer().


Якщо ви хочете отримати всі дані форми:

$form->getData();

Якщо ви переслідуєте певне поле форми (наприклад first_name):

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


4

Я працюю так:

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

Вам також потрібно мати запит $ request як параметр у функції! Сподіваюся, це допомагає.


якщо ваша форма не генерується за допомогою конструктора форм sf2, то лише це покаже вам значення форми, а не інші рішення. +1 товариш
Nikhil Chaudhary

4

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

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.

Це те, що я шукав. Проект, над яким я працюю, знаходиться в symfony 2.0 і не може бути оновлений.
Наомі

3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

Якщо у вашій формі є підформи, цей код має виглядати так:$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance

2

Якщо ви використовуєте управління безпекою Symfony 2, вам не потрібно отримувати опубліковані значення, вам потрібно лише керувати шаблоном форми (див. Документацію ).

Якщо ви не використовуєте систему управління безпекою Symfony 2, раджу настійно використовувати його. Якщо ви не хочете або не можете, можете надати нам LoginTypeджерела?


Дякую @BlackCharly Я починаю читати документацію. Я також оновив код, щоб надати читачеві повну ясність. Цінуйте вашу допомогу.
VishwaKumar


0

Для не зіставлених полів форми я використовую $ form-> get ('inputName') -> getViewData ();

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.