So erhalten Sie die Anforderungsparameter in symfony2

203

Ich bin sehr neu in der Symfonie. In anderen Sprachen wie Java und anderen kann request.getParameter('parmeter name')ich den Wert ermitteln.

Gibt es etwas Ähnliches, das wir mit symfony2 machen können?
Ich habe einige Beispiele gesehen, aber keines funktioniert für mich. Angenommen, ich habe ein Formularfeld mit dem Namen Benutzername . In der Formularaktion habe ich versucht, so etwas zu verwenden:

$request = $this->getRequest();
$username= $request->request->get('username'); 

Ich habe es auch versucht

$username = $request->getParameter('username');

und

$username=$request->request->getParameter('username');

Aber keine der Optionen funktioniert. Die folgenden Optionen haben jedoch einwandfrei funktioniert:

foreach($request->request->all() as $req){
    print_r($req['username']);
}

Wo mache ich Fehler bei der Anwendung der getParameter()Methode? Jede Hilfe wird geschätzt.

Abdul Hamid
quelle
Sie haben einen Tippfehler in Zeile zwei: $request->request-get()sollte sein $request->request->get(). Könnte das sein?
Halfer
habe das gleiche in den code.missed out here geschrieben. Tut mir leid für den Tippfehler hier. trotzdem funktioniert das nicht.
Abdul Hamid
Haben Sie (a) das Handbuch überprüft, um sicherzustellen, dass get()es die richtige Methode ist, und (b) PHP-Hinweise aktiviert, damit Sie feststellen können, ob es Probleme gibt? (c) Verfügt Symfony 2 über eine Debug-Symbolleiste wie Symfony 1, sodass Sie feststellen können, ob Sie Fehler gemacht haben?
Halfer
Verwechseln Sie Vorname und Benutzername?
Greg0ire
Weitere Informationen finden Sie hier: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

Antworten:

416

Die Benennung ist gar nicht so intuitiv:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');
Cerad
quelle
46
Es unterscheidet sich von dem, was PHP verwendet, aber es macht tatsächlich mehr Sinn. $_GETDaten sind Daten aus der Abfragezeichenfolge (überhaupt keine GETAnforderung erforderlich) und $_POSTDaten sind Daten aus dem Anforderungshauptteil (muss auch keine POSTAnforderung sein, könnte es sein PUT).
igorw
5
versuchte $ request-> query-> get ('name'); aber es funktioniert auch nicht.
Abdul Hamid
7
Wie erhalte ich die Parameter aus einer PUT-Anfrage?
Tjorriemorrie
10
Sehr seltsame Benennung hier sicherlich $request->getund $request->postwäre einfacher.
Crmpicco
3
Kommentar von igorw bringt Klarheit in diese
verrückte
32

Ich mache es noch einfacher:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

Eine andere Möglichkeit besteht darin, Ihre Parameter in Ihre Aktionsfunktionsdefinition einzuführen:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

Dabei wird davon ausgegangen, dass Sie {foo} und {bar} als Teil Ihres URL-Musters in Ihrer routing.yml-Datei definiert haben:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }
pkout
quelle
und wenn ich im ersten Beispiel einen fooParameter sowohl in der Abfragezeichenfolge als auch im POST-Text habe, von welchem ​​wird dieser zurückgegeben $request->get('foo')?
Dimitry K
1
Sieht so aus, als hätte der Vorrang GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K
Dies ist die beste Antwort
Steampowered
7
Nein, ist es nicht. In der Dokumentation der Methode selbst wird davon abgeraten, sie zu verwenden, da sie schwerer ist als der Zugriff auf die GET / POST-Parameter über ihre spezifischen Sammlungen.
Jurchiks
1
Antwort ist richtig $request->get('foo'); funktioniert für ALLE Taschen (Reihenfolge ist: PATH, GET, POST). Trotzdem $request->request->get('foo');funktioniert nur für POST-Tasche. Schließlich wird die erste ( $request->get()) nicht empfohlen, wenn wir wissen, wo sich die Daten befinden (GET / POST).
F2000
18

Sie können den folgenden Code verwenden, um Ihre Formularfeldwerte abzurufen

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

Oder Sie können auch alle Formularwerte als Array abrufen, indem Sie verwenden

$request->request->all()
Skorpion
quelle
3
$ request-> request-> all () funktioniert für mich, aber so etwas wie $ request-> query-> get ('foo'); funktioniert nicht.
Abdul Hamid
13

Versuchen

$request->request->get('acme_demobundle_usertype')['username']

Überprüfen Sie den Attributnamen Ihres Formularfelds

MartinW.
quelle
1
+1, da ich denke, dass von allen Antworten nur diese tatsächlich das Nicht-Offensichtliche angibt - in Fällen, in denen Sie Ihre Formulare mithilfe des Formularerstellers von symfony automatisch erstellt haben, benennt symfony das Formularfeld in etwas mehr um als Sie erwarten von. Like name = "acme_demobundle_userform [field_name]"
userfuser
Die hier erwähnte Syntax funktioniert nicht mit PHP 5.3.10. Was ist die Mindestversion, um dies zu unterstützen?
Justinas Lelys
2
@justinasLelys try $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['username'];
Schläfer
@ JustinasLelys Syntax ist PHP 5.4
COil
"Benutzername" kann nicht definiert werden. Also besser mit "??" zuerst.
Viktor Sydorenko
9

In einem Controller:

$request = $this->getRequest();
$username = $request->get('username');
Reinherd
quelle
6
In neueren Versionen von Symfony $this->getRequest()ist es veraltet, die Anforderung in die Controller-Aktion public function showAction(Request $request, $id);
einzufügen
9

Deine Optionen:

  1. Einfach:
    • $request->request->get('param')( $_POST['param']) oder
    • $request->query->get('param')( $_GET['param'])
  2. Gute Symfony-Formulare mit allen Validierungen, Werttransformationen und Formularwiedergaben mit Fehlern und vielen anderen Funktionen:
  3. Etwas dazwischen (siehe Beispiel unten)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

Weitere Informationen zuOptionsResolver - http://symfony.com/doc/current/components/options_resolver.html

Luchaninov
quelle
8

Da die $this->getRequest()Methode jetzt veraltet ist, müssen Sie ein RequestObjekt wie folgt in Ihre Controller-Aktion einfügen:

public function someAction(Request $request)

Danach können Sie eine der folgenden Optionen verwenden.

Wenn Sie POST-Daten von der Anforderung abrufen möchten, verwenden Sie Folgendes:

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

Wenn Sie jedoch GET-Daten von der Anforderung abrufen möchten, verwenden Sie Folgendes:

$request->query->get('var_name');
Ashish Awasthi
quelle
6

Sie können dies folgendermaßen tun:

$clientName = $request->request->get('appbundle_client')['clientName'];

Wenn die Attribute geschützt sind, können Sie manchmal keinen Zugriff haben, um den Wert für die allgemeine Zugriffsmethode abzurufen:

(POST)

 $clientName = $request->request->get('clientName');

(BEKOMMEN)

$clientName = $request->query->get('clientName');

(GENERISCH)

$clientName = $request->get('clientName');
Yoander
quelle
1
Willkommen bei Stack Overflow. Bitte formatieren Sie Ihre Antwort, um sie beim nächsten Mal besser lesbar zu machen, und überprüfen Sie auch diese Hilfeseite: So
Fabian Horlacher
Was ist, wenn es nach get 2 Wert gibt? so$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar
3

Die meisten Fälle wie das Abrufen von Abfragezeichenfolgen oder Formularparametern werden in den obigen Antworten behandelt.

Bei der Arbeit mit Rohdaten kann json_decode()die Methode Request::getContent()verwendet werden, z. B. eine JSON-Rohzeichenfolge im Hauptteil, der Sie als Argument geben möchten .

$content = $request->getContent();

Weitere nützliche Informationen zu HTTP-Anforderungen in Symfony finden Sie in der Dokumentation des HttpFoundation- Pakets.

Antonis Charalambous
quelle
1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');
Manuel M.
quelle
Ist dies immer noch der richtige Weg für Funktionen, die den RequestParameter nicht haben ? (zB in privaten Funktionen der Controller-Klasse zum Beispiel)
Fritzmg
1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

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

}

Danke, Sie können auch den obigen Code verwenden

Treffen
quelle
0

Wenn Sie den Wert von einer Auswahl erhalten möchten, können Sie Folgendes verwenden:

$form->get('nameSelect')->getClientData();
Sncardonam
quelle
0

Versuchen Sie dies, es funktioniert

$this->request = $this->container->get('request_stack')->getCurrentRequest();

Grüße

AchrafSoltani
quelle
Dies beantwortet die Frage überhaupt nicht. Die Person, die die Frage stellt, hat bereits Zugriff auf das Anforderungsobjekt.
Layton Everson
1
@LaytonEverson Entschuldigung, aber Sie irren sich, seine Methode // $ this-> getRequest () ist seit 2.4 veraltet, deshalb funktioniert sie nicht, so dass er nicht wirklich Zugriff auf das Anforderungsobjekt hat;)
AchrafSoltani
Obwohl Sie sich nicht irren, fragt sich der Fragesteller, mit welcher Methode eine Variable aus dem Anforderungsobjekt abgerufen wird. @Cerad hat diese Frage richtig beantwortet. Er bot nicht nur die richtige Möglichkeit, auf das Anforderungsobjekt zuzugreifen, sondern beantwortete auch die Frage.
Layton Everson
0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}
abhinand
quelle
1
Während dieser Code die Frage beantworten kann, ist es besser, einen Kontext aufzunehmen, der erklärt, wie er funktioniert und wann er verwendet werden soll. Nur-Code-Antworten sind auf lange Sicht nicht sinnvoll.
Bono
0

Für Benutzer von symfony 4:

$query = $request->query->get('query');
Schmied
quelle
0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Khandaker Toihidul Islam
quelle