2016-03-25 18 views
0

Seit 2.4 können wir die RequestStack in unsere Dienste injizieren.RequestStack Wann sollte ich getMasterRequest anstelle von getCurrentRequest verwenden?

Um die aktuelle Request, abrufen gibt es zwei Methoden:

/** @var Request */ 
$request = $requestStack->getCurrentRequest(); 

// OR 

/** @var Request */ 
$request = $requestStack->getMasterRequest(); 

Wann sollten wir die currentRequest benutzen?
Und wann sollten wir die masterRequest verwenden?

Zum Beispiel, wenn ich die Parameter im Körper des aktuellen Request abrufen müssen, würde ich verwenden:

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

Welche der beiden Methoden soll ich verwenden?

Antwort

1

Wenn Sie mit mehreren Anfragen zu tun, die nicht Anfrage Master kommt aus interne Anfragen. Gewöhnlich von Zweig in Form von

{{ render(controller('foo')) }} 

Wenn die zweite Anforderung erstellt wird, nur das Anforderungsformat und Gebietsschema auf die neue Instanz kopiert. Daher sind keine Daten verfügbar, von denen Sie erwarten, dass sie vom Benutzer stammen. Dazu gehören Anfrageparameter, IP-Adresse und alle HTTP-Header.

In den meisten Fällen müssen Sie nur die aktuelle Anfrage bearbeiten. Aber um Ihre Frage zu beantworten, benötigen Sie immer die Master-Anfrage, wenn Sie Daten benötigen, die vom Benutzer kommen. Ein Beispiel wäre die Verwendung der Benutzer-IP-Adresse, um eine CountryType Formularsteuerung vorzuwählen. Wenn Sie getMasterRequest()->getClientIp() verwenden, erhalten Sie die IP-Adresse des Benutzers (etwa 209.58.130.174). Wenn Sie es auf dem Nicht-Master aufrufen, erhalten Sie die IP-Adresse localhost/loopback (127.0.0.1). Es gibt nicht wirklich Methoden, die null zurückgeben, sie geben einfach unterschiedliche Informationen darüber zurück, wie die Anforderung erstellt wurde.

+0

So ziemlich alles, was ich brauchte, danke. Über die Verfügbarkeit von Benutzerinformationen, können Sie mir bitte ein Beispiel für eine Methode geben, die nicht zugänglich ist (oder ein leeres Ergebnis geben kann), indem Sie 'currentRequest' verwenden und mit der' masterRequest' erreichbar sind? – chalasr

+0

Danke @Twifty! – chalasr

1

Die Masteranforderung ist die, die vom ursprünglichen Benutzer stammt; Die Unteranforderung ist diejenige, die Sie intern ausführen - entweder mit der forward() - Methode von HttpKernel - oder mit dem forward() - Hilfsprogramm der Controller-Klasse des Frameworks - oder {% render ...%} in Twig.

https://stackoverflow.com/a/12456998/1078488

Das heißt, Sie normalerweise die aktuelle Anforderung verwenden würde, wenn Sie nicht explizit tun wollen die tatsächliche Anforderung durch den Anwender.

ich die aktuelle Anfrage einen Service für die Injektion verwendet haben:

app.request: 
    class: Symfony\Component\HttpFoundation\RequestStack 
    factory: 
     - '@request_stack' 
     - 'getCurrentRequest' 

Dann können Sie es wie folgt injizieren:

app.some_service: 
    class: AppBundle\Service\SomeService 
    arguments: 
     - '@app.request' 
     - '@some_other_service' 
+0

Vielen Dank für Ihre Antwort. Ich habe die Frage schon gesehen, aber ich kann nicht sehen, wann ich 'masterRequest' anstelle von' currentRequest' verwenden soll, und was wäre der Unterschied, wenn ich die erste oder die zweite benutze, um Informationen aus der Anfrage wie Körperparameter oder Überschriften. Gibt es einen richtigen Weg zwischen diesen beiden Möglichkeiten? – chalasr

+0

Das war der Grund, warum ich antwortete, anstatt nur zu wählen, um das als Duplikat zu schließen. – JimL

+0

Können Sie versuchen, die Fragen zu beantworten, die ich in meinem vorherigen Kommentar gegeben habe? Und danke für die Fabrik, es ist nützlich. – chalasr

Verwandte Themen