So erhalten Sie Formularwerte im Symfony2-Controller


81

Ich verwende ein Anmeldeformular auf Symfony2 mit dem folgenden Controller-Code

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

Aber ich bekomme folgende Warnung:

Warnung: array_replace_recursive () [function.array-replace-recursive]: Argument Nr. 1 ist kein Array in der Zeile \ vendor \ symfony \ src \ Symfony \ Component \ Form \ Form.php 593 500 Interner Serverfehler - ErrorException

Kann mir jemand helfen zu verstehen, was falsch ist und wie ich es beheben kann? Vielen Dank.

Update: Die Zweigdatei sieht ungefähr so ​​aus:

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

Hier ist die Funktion im Formulartyp

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

Hier ist die Route:

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

Antworten:


99

Einfach :

$data = $form->getData();

1
Schöne Antwort - RE: unten Antworten. Symfony bietet oft viele Möglichkeiten, um ähnliche Ergebnisse zu erzielen. Es ist immer gut, nach "Best Practices" zu suchen, wenn Sie nach SF-Lösungen suchen.
— JustinP

8
Für neue Versionen: $ data = $ form-> all ();
— Gmajoulet

92

Keines der oben genannten hat bei mir funktioniert. Das funktioniert bei mir:

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

Ich hoffe, es hilft.


2
Hmmm seltsam, ich habe es mit $ request-> request-> get ('Benutzername') zum Laufen gebracht; Haben Sie das Anforderungsobjekt als Parameter an die Aktion übergeben? Und Sie müssen auch die Anforderungsklasse in die oben genannten aufnehmen.
— VishwaKumar

59

In Symfony 2 (genauer gesagt in der Version 2.3) können Sie Daten eines Felds von abrufen

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

oder Sie können alle Daten senden lassen

$data = $form->getData();

Dabei ist '$ data' ein Array, das die Werte Ihrer Formularfelder enthält.


20

In Symfony> = 2.3 können Sie den Wert einzelner Felder abrufen mit:

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

Auf der anderen Seite können Sie verwenden:

$data = $form->getData();

ABER das würde dir zwei verschiedene Dinge bringen:

  • die Entität mit den vom Formular data-classausgefüllten Werten, wenn für Ihr Formular die Option aktiviert ist (es ist also an eine Entität gebunden); dies ausschließt jedes Feld mit der 'mapping' => falseOption

  • Andernfalls ein Array mit allen Feldern des Formulars


18

Wenn Sie zusätzliche Felder in dem Formular haben, die nicht in Entity definiert sind, $form->getData()funktioniert dies nicht. Eine Möglichkeit ist folgende:

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

Oder :

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

Vielen Dank! Du hast meinen Tag gerettet!

Vielen Dank! Das hat sehr geholfen.
— Madshvero

Wenn Sie die ID der Abfrage benötigen, wenn es sich um ein Objekt handelt, können Sie den folgenden Befehl ausführen: $ form-> get ('foo') -> getData () -> getId ();
— Juanitourquiza

Schätzen Sie wirklich Ihre Antwort, es war wirklich hilfreich.
— Ivan Franco

5

In Symfony- Formularen gibt es zwei verschiedene Arten von Transformatoren und drei verschiedene Arten von zugrunde liegenden Daten: Geben Sie hier die Bildbeschreibung ein In jeder Form sind die drei verschiedenen Arten von Daten:

  • Modelldaten

    Dies sind die Daten in dem Format, das in Ihrer Anwendung verwendet wird (z. B. ein Issue-Objekt). Wenn Sie Form::getData()oder anrufen Form::setData(), haben Sie es mit den "Modell" -Daten zu tun.

  • Normdaten

    Dies ist eine normalisierte Version Ihrer Daten und entspricht im Allgemeinen Ihren "Modell" -Daten (in unserem Beispiel jedoch nicht). Es wird nicht häufig direkt verwendet.

  • Daten anzeigen

    In diesem Format werden die Formularfelder selbst ausgefüllt. Es ist auch das Format, in dem der Benutzer die Daten übermittelt. Wenn Sie aufrufen Form::submit($data), liegen die $ data im Datenformat "view" vor.

Die zwei verschiedenen Arten von Transformatoren helfen bei der Konvertierung zu und von jedem dieser Datentypen:

  • Modelltransformatoren :

    transform(): "Modelldaten" => "Normdaten"
    reverseTransform(): "Normdaten" => "Modelldaten"

  • Transformatoren anzeigen :

    transform(): "Normdaten" => "Daten anzeigen"
    reverseTransform(): "Daten anzeigen" => "Normdaten"

Welchen Transformator Sie benötigen, hängt von Ihrer Situation ab.

Rufen Sie an, um den Ansichtstransformator zu verwenden addViewTransformer().


Wenn Sie alle Formulardaten erhalten möchten:

$form->getData();

Wenn Sie nach einem bestimmten Formularfeld suchen (zum Beispiel first_name):

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


4

Ich habe es dadurch zum Laufen gebracht:

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

    // Do something with the post data
}

Sie müssen auch die Request $ -Anforderung als Parameter in der Funktion haben! Hoffe das hilft.


Wenn Ihr Formular nicht mit dem sf2 Form Builder generiert wird, zeigt Ihnen nur dies den Formularwert, keine anderen Lösungen. +1 Kumpel
— Nikhil Chaudhary

4

Ich denke, um die Anforderungsdaten zu erhalten, die vom Formularobjekt gebunden und validiert werden, müssen Sie diesen Befehl verwenden:

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

Das habe ich gesucht. Das Projekt, an dem ich arbeite, ist in Symfony 2.0 und kann nicht aktualisiert werden.
— Naomi

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

Wenn Ihr Formular Unterformulare enthält, sollte dieser Code wie $data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
— folgt

2

Wenn Sie die Sicherheitsverwaltung von Symfony 2 verwenden, müssen Sie keine veröffentlichten Werte abrufen, sondern nur die Formularvorlage verwalten (siehe Dokumentation ).

Wenn Sie Symfony 2 Security Management nicht verwenden, empfehle ich Ihnen dringend, es zu verwenden. Wenn Sie nicht wollen oder nicht können, können Sie uns die LoginTypeQuellen geben?


Danke @BlackCharly Ich fange an, die Dokumentation zu lesen. Ich habe auch den Code aktualisiert, um dem Leser vollständige Klarheit damit zu geben. Schätze deine Hilfe.
— VishwaKumar

1

Wenn Symfony 4 oder 5, verwenden Sie diesen Code (wobei name der Name Ihres Feldes ist):

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

0

Für nicht zugeordnete Formularfelder verwende ich $ form-> get ('inputName') -> getViewData ();

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.