Greifen Sie auf POST-Werte im Symfony2-Anforderungsobjekt zu

93

OK, das ist eine Anfängerfrage, aber ich kann die Antwort nirgendwo finden. In einem Controller in Symfony2 möchte ich von einem meiner Formulare aus auf den POST-Wert zugreifen. In der Steuerung habe ich:

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');

Gibt leider $name_valuenichts zurück. Was mache ich falsch? Vielen Dank!

Acyra
quelle

Antworten:

99

Symfony 2.2

Diese Lösung ist seit 2.3 veraltet und wird in 3.0 entfernt, siehe Dokumentation

$form->getData();

gibt Ihnen ein Array für die Formularparameter

aus dem symfony2-Buch Seite 162 (Kapitel 12: Formulare)

[...] Manchmal möchten Sie möglicherweise nur ein Formular ohne Klasse verwenden und ein Array der übermittelten Daten zurückerhalten. Das ist eigentlich ganz einfach:

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
}

Sie können auch direkt über das Anforderungsobjekt auf POST-Werte (in diesem Fall "Name") zugreifen, wie folgt:

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

Beachten Sie jedoch, dass in den meisten Fällen die Verwendung der Methode getData () die bessere Wahl ist, da die Daten (normalerweise ein Objekt) zurückgegeben werden, nachdem sie vom Formularframework transformiert wurden.

Wenn Sie auf das Formular-Token zugreifen möchten, müssen Sie die Antwort von Problematic verwenden, $postData = $request->request->get('contact');da getData()das Element aus dem Array entfernt wird


Symfony 2.3

seit 2.3 solltest du verwenden handleRequeststatt bindRequest:

 $form->handleRequest($request);

siehe Dokumentation

timaschew
quelle
4
Das ist großartig und jetzt ist die beste Antwort. $ form-> getData () existierte nicht oder wurde nicht dokumentiert, als ich die Frage stellte.
Acyra
4
Um Anforderungsdaten an Formulare in den neuesten Versionen zu binden, sollten Sie $ form-> handleRequest ($ request) verwenden. anstelle von $ form-> submit ($ request); Meiner Ansicht nach. Weitere Details symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev
127

Die Post-Werte des Formulars werden in der Anforderung unter dem Namen des Formulars gespeichert. Wenn Sie beispielsweise die getName()Methode von ContactType () überschrieben haben , um "contact" zurückzugeben, gehen Sie folgendermaßen vor:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

Wenn Sie immer noch Probleme haben, versuchen Sie ein tun var_dump()auf $request->request->all()alle die Postwerte zu sehen.

Problematisch
quelle
2
Danke dir. Der var_dump hat geholfen, und ich habe dies mit einem vollständigen Namen angegriffen, um die Formulardaten wiederherzustellen, z. B. $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra
1
Siehe die Antwort von timaschew unten, da dies gefragt wurde, fügte Symfony2 eine neue Methode hinzu: $ form-> getData ();
Acyra
2
Wenn Sie das überschrieben haben getName(), ist es sinnvoll, Namen nicht fest zu codieren:$request->request->get($form->getName());
Meze
Danke .. Ich habe viel Zeit gespart :) Prost !!
Anjana Silva
38

Was für mich funktioniert hat, war Folgendes:

$data = $request->request->all();
$name = $data['form']['name'];
ramzey
quelle
Dies ist, was Problematic erwähnt, + siehe Kommentar von @meze dort
phpsherpa
17

Es gibt einen Trick mit der ParameterBag::get()Methode. Sie können einstellen , $deepParameter zu trueund Zugriff auf den erforderlichen tiefen verschachtelten Wert ohne zusätzlichen Variable:

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

Sie haben auch die Möglichkeit, einen Standardwert (2. Parameter der get()Methode) festzulegen, um redundante isset($form['some']['deep']['data'])Aufrufe zu vermeiden .

Dmitriy
quelle
Der dritte Parameter ist veraltet und wurde aus 3.0 entfernt. Hinweis: Das Suchen tiefer Elemente ist seit Version 2.8 veraltet und wird in 3.0 entfernt. : github.com/symfony/symfony/blob/…
AL
8

Auf die Felddaten kann in einer Steuerung zugegriffen werden mit: Listing 12-34

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

Darüber hinaus können die Daten eines nicht zugeordneten Felds auch direkt geändert werden: Listing 12-35

$form->get('dueDate')->setData(new \DateTime());

Seite 164 symfony2-Buch (erstellt am 9. Oktober 2013)

Meteor
quelle
7

Ich greife auf folgende Weise auf den Parameter ticketNumber für meine mehrteilige Post-Anfrage zu.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
Ilker Baltaci
quelle
1

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

$form->getClientData();

Chicna
quelle
7
getClientData ist veraltet. Verwenden Sie getData, getViewData, getNormData .... Die Form-Komponente ist in SF2 wirklich chaotisch (sie sollten sich wirklich von der Java-Welt und dem coolen RequestDataBinder inspirieren lassen ....)
Thomas Decaux
0

Symfony- Dokument zum Abrufen von Anforderungsdaten

Schließlich kann mit getContent () auf die mit dem Anforderungshauptteil gesendeten Rohdaten zugegriffen werden:

$ content = $ request-> getContent ();

Alex Joe
quelle
-14

Wenn Sie ein Neuling sind, begrüßen Sie Symfony2, ein Open-Source-Projekt. Wenn Sie also viel lernen möchten, können Sie die Quelle öffnen!

Aus "Form.php":

getData () getNormData () getViewData ()

Weitere Details finden Sie in dieser Datei.

Thomas Decaux
quelle
Verwenden Sie immer die Symfony-Methode, $ _POST, $ request ist schmutzig
Thomas Decaux
Ja, ich bin nicht gut für Erklärungen ^^ aber dies ist genau die gleiche Lösung als die bestätigte, dass $form->getData();ich weiß, dass die Leute faul sind und eine Lösung wollen, ohne ein bisschen nachzudenken ;-(
Thomas Decaux