Jak uzyskać wartości formularza w kontrolerze Symfony2

81

Używam formularza logowania w Symfony2 z następującym kodem kontrolera

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()));
}

Ale otrzymuję następujące ostrzeżenie:

Ostrzeżenie: array_replace_recursive () [function.array-replace-recursive]: Argument nr 1 nie jest tablicą w \ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php wiersz 593500 Wewnętrzny błąd serwera - wyjątek ErrorException

Czy ktoś może mi pomóc zrozumieć, co jest nie tak i jak mogę to naprawić? Dzięki.

Aktualizacja: plik twig wygląda mniej więcej tak:

<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>

Oto funkcja w typie formularza

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

Oto trasa:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}
VishwaKumar
źródło

Odpowiedzi:

99

Po prostu:

$data = $form->getData();
Hubert Perron
źródło
1
Niezła odpowiedź - RE: poniżej odpowiedzi. Symfony często pozwala na wiele sposobów uzyskania podobnych wyników. Szukając rozwiązań SF, zawsze dobrze jest zapoznać się z „Najlepszymi praktykami”.
JustinP
8
Dla nowych wersji: $ data = $ form-> all ();
Gmajoulet
92

Żadne z powyższych nie działało dla mnie. To działa dla mnie:

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

Mam nadzieję, że to pomoże.

pkout
źródło
2
Hmmm dziwne, działało z $ request-> request-> get ('nazwa użytkownika'); Czy przekazałeś obiekt żądania jako parametr do akcji? Musisz również uwzględnić klasę żądania w powyższym.
VishwaKumar
59

W Symfony 2 (a dokładniej w wersji 2.3) możesz pobrać dane pola wg

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

lub możesz otrzymać wszystkie wysłane dane

$data = $form->getData();

gdzie „$ data” to tablica zawierająca wartości pól formularza.

Albert
źródło
20

W Symfony> = 2.3 możesz uzyskać wartość pojedynczych pól za pomocą:

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

Z drugiej strony możesz użyć:

$data = $form->getData();

ALE to dałoby ci dwie różne rzeczy:

  • encja z wartościami wypełnionymi przez formularz, jeśli formularz ma data-classwłączoną opcję (więc jest powiązany z jednostką); spowoduje to wykluczenie wszystkich pól z 'mapping' => falseopcją

  • w przeciwnym razie tablica zawierająca wszystkie pola formularza

Drelich
źródło
18

Jeśli masz dodatkowe pola w formularzu, które nie są zdefiniowane w Entity, $form->getData()nie działają, jednym ze sposobów może być:

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

Lub:

$form->get('foo')->getData();
Saman Mohamadi
źródło
Dziękuję Ci! Uratowałeś mi dzień!
Dziękuję Ci! To bardzo pomogło.
madshvero
jeśli potrzebujesz identyfikatora zapytania, jeśli jest to obiekt, możesz wykonać następujące polecenie: $ form-> get ('foo') -> getData () -> getId ();
juanitourquiza
Naprawdę doceniam twoją odpowiedź, była naprawdę pomocna.
Ivan Franco
5

W formach Symfony istnieją dwa różne typy transformatorów i trzy różne typy danych bazowych: wprowadź opis obrazu tutaj W dowolnej formie trzy różne typy danych to:

  • Dane modelu

    Są to dane w formacie używanym w Twojej aplikacji (np. Obiekt Issue). Jeśli dzwonisz Form::getData()lub Form::setData()masz do czynienia z danymi „modelowymi”.

  • Dane norm

    To jest znormalizowana wersja Twoich danych i zwykle są takie same jak dane „modelowe” (choć nie w naszym przykładzie). Nie jest powszechnie używany bezpośrednio.

  • Wyświetl dane

    Jest to format używany do wypełniania samych pól formularza. Jest to również format, w jakim użytkownik będzie przesyłał dane. Kiedy dzwonisz Form::submit($data), $ data ma format danych „widok”.

Dwa różne typy transformatorów pomagają w konwersji do iz każdego z tych typów danych:

  • Modelowe transformatory :

    transform(): "dane modelu" => "dane norm"
    reverseTransform(): "dane norm" => "dane modelu"

  • Zobacz transformatory :

    transform(): "dane norm" => "wyświetl dane"
    reverseTransform(): "wyświetl dane" => "dane norm"

To, który transformator potrzebujesz, zależy od Twojej sytuacji.

Aby skorzystać z transformatora widoku, zadzwoń addViewTransformer().


Jeśli chcesz uzyskać wszystkie dane formularza:

$form->getData();

Jeśli szukasz określonego pola formularza (na przykład first_name):

$form->get('first_name')->getData();
Pmpr
źródło
4

Mam to działające przez to:

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

    // Do something with the post data
}

W funkcji również musisz mieć żądanie Request $ jako parametr! Mam nadzieję że to pomoże.

VishwaKumar
źródło
jeśli twój formularz nie jest generowany przy użyciu kreatora formularzy sf2, to tylko to pokaże ci wartość formularza, a nie inne rozwiązania. +1 mate
Nikhil Chaudhary
4

Myślę, że aby uzyskać dane żądania, powiązane i zatwierdzone przez obiekt formularza, musisz użyć tego polecenia:

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
Chicna
źródło
To jest to, czego szukałem. Projekt nad którym pracuję jest w symfony 2.0 i nie może być aktualizowany.
Naomi
3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}
viciouskinid
źródło
Jeśli Twój formularz ma podformularze, kod powinien wyglądać następująco: $data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance
2

Jeśli korzystasz z zarządzania bezpieczeństwem Symfony 2, nie musisz pobierać zaksięgowanych wartości, wystarczy zarządzać szablonem formularza (zobacz dokumentację ).

Jeśli nie korzystasz z zarządzania bezpieczeństwem Symfony 2, radzę go używać. Jeśli nie chcesz lub nie możesz, czy możesz podać nam LoginTypeźródła?

BlackCharly
źródło
Dzięki @BlackCharly zaczynam czytać dokumentację. Zaktualizowałem również kod, aby czytelnik był w pełni zrozumiały. Doceniam Twoją pomoc.
VishwaKumar
1

Jeśli Symfony 4 lub 5, po prostu użyj tego kodu (gdzie nazwa to nazwa twojego pola):

$request->request->get('name');
Ebenezer Nikabou
źródło
0

Dla niezamapowanych pól formularza używam $ form-> get ('inputName') -> getViewData ();

Strabek
źródło