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}
VishwaKumar
quelle

Antworten:

99

Einfach :

$data = $form->getData();
Hubert Perron
quelle
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.

pkout
quelle
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.

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

Jean
quelle
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();
Saman Mohamadi
quelle
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();
Pmpr
quelle
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.

VishwaKumar
quelle
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.
Chicna
quelle
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;
}
bösartigkinid
quelle
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?

BlackCharly
quelle
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');
Ebenezer Nikabou
quelle
0

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

Strabek
quelle