Unterschied zwischen der Verwendung der Sitzung über eine HTTP-Anforderungsinstanz und der Verwendung des globalen Sitzungshelfers in Laravel

8

Ich konnte keine Informationen finden, die zwei Arten von Sitzungszugriffsmethoden betreffen. $request->session() aus HTTP-Request-Instanz und session() aus Session-Helper in Laravel 5.3. Gibt es einen Unterschied oder welchen zu verwenden?

So senden Sie eine Abrufanforderung an die Controller-Methode unter Verwendung der P.H.P-Einheit

%Vor%     
BRjava 02.03.2017, 05:43
quelle

5 Antworten

7

Der Service Container ist der Kern der Laravel-Architektur. Alle Dienste, Komponenten und Abhängigkeiten sind dort registriert und Sie können jederzeit nach ihnen fragen.

Aber Laravel bietet mehr als eine Möglichkeit, "danach zu fragen". Sie haben die globalen Hilfsfunktionen, Sie haben Fassaden, Sie haben die "richtige", "reinere" Injektion der Komponenteninstanz in die Methodensignatur. Ich denke, ein großer Teil der Philosophie von Laravel ist eine saubere, einfache, intuitive API. Und in diesem Fall kann es Ihrer persönlichen Vorliebe überlassen bleiben, zu definieren, was "sauber und einfach" ist und was Ihrem Stil entspricht, per Definition, intuitiv für Sie.

Ich weiß, es gab hitzige Debatten in der PHP-Community darüber, welche Methode "am besten" ist, Fassaden waren umstritten, traditionelle Abhängigkeitsinjektion OOP-Puristen sagen, der einzig richtige Weg könnte sein, das Objekt mit der Controller-Methodensignatur zu injizieren. .

Am Ende greifen alle diese verschiedenen Methoden einfach auf das Objekt aus dem gleichen Servicebeutel. Es macht keinen Unterschied in der Leistung (ich wette, zwei Funktionsaufrufe von Indirection werden Ihre Leistung nicht beeinflussen) oder auf andere Weise. Also, benutze was immer deinem Stil entspricht. Ich persönlich mache die "richtige" Injektion sowieso, wenn ich in einem typischen Controller bin, aber vielleicht benutze ich den globalen Helfer, wenn es einen saubereren, lesbareren Code in seinem Kontext macht.

%Vor%

Und nebenbei, wie Sie sehen können, haben Sie mehr als nur zwei Optionen:)

Natürlich gilt dies nicht nur für Sitzungen, das Gleiche gilt für das Abrufen der Anforderungsdaten, das Abrufen der DB-Verbindung und vieles mehr.

(Außerdem glaube ich, dass Sie die Echtzeit-Fassaden in 5.3 noch nicht haben)

    
alepeino 04.10.2017, 14:16
quelle
2

$ request- & gt; session () und session () sind beide gleich.

Es gibt zwei Hauptarbeitsweisen mit Sitzungsdaten in Laravel: die globale Funktion in session () helper und über eine $ request-Instanz.

Sie können es so verwenden

%Vor%     
Sateesh 02.03.2017 07:26
quelle
1
  1. Laravel-Dokumentation

Laut den Laravel-Dokumenten - Ссылка - gibt es keinen praktischen Unterschied zwischen der Verwendung der Sitzung über eine HTTP-Anforderungsinstanz versus die Verwendung des globalen Session-Helfers "und dass beide testbar sind.

->assertSessionHas($key, $value = null);

  1. Laravel Up & amp; Running - Matt Stauffer

In seinem Buch (Seite 320-) erklärt Matt die verschiedenen Möglichkeiten, auf Sitzungsinformationen zuzugreifen:

  • Verwenden Sie die Session -Fassade

    session()->get('user_id');

  • Verwenden Sie die Methode session() für ein beliebiges angegebenes Objekt Request belichten

    Route::get('dashboard', function(Request $request) { $request->session()->get('user_id'); });

  • Injizieren Sie eine Instanz von Illuminate\Session\Store

    Route::get('dashboard', function(Illuminate\Session\Store $session) { return $session->get('user_id'); });

  • Verwenden des globalen session() -Helfers

    $value = session()->get('key); $value = session('key);

Sein letzter Kommentar lautet: Wenn Sie in Laravel neu sind und sich nicht sicher sind, welchen Sie verwenden sollen, empfehle ich den globalen Helfer .

Also, ich würde mir keine Sorgen über die Unterschiede machen und einfach mit dem gehen, was sich für dich anfühlt. Wenn Sie keine Präferenz haben, gehen Sie mit Matt Stauffer Empfehlung.

    
kerrin 08.10.2017 08:51
quelle
0

Tatsächlich ist die native PHP-Sitzung eine fertige Lösung im Vergleich zu einer besseren Implementierung von Laravel und Symfony, die mehr darüber nachgedacht haben. Lesen Sie die Erklärung im Symfony Session-Konfigurationshandbuch und Sie werden verstehen, denke ich. Es gibt also einen Unterschied, aber wie es gedacht und umgesetzt wird. Vom Standpunkt der Performance denke ich, dass es nicht viel gibt. Ich werde dich deine Schlüsse ziehen lassen. Ein weiterer hilfreicher Eintrag ist im PHP-Handbuch

    
Marco 06.10.2017 19:20
quelle
0

Wie Sie normalerweise die beiden Optionen verwenden, gibt es keinen praktischen Unterschied zwischen $request->session() und session() . Sie geben jedoch technisch nicht die gleichen Objekte zurück.

session() gibt SessionManager zurück. $request->session() gibt die Sitzung Store zurück.

Das Store ist eigentlich das Objekt, das die Sitzungsdaten enthält.

Das SessionManager ist das Objekt, das die verfügbare Sitzung Store s verwaltet. Die meisten Anwendungen verwenden immer nur einen Sitzungsspeicher (den Standardspeicher).

Der Grund, warum sie als das gleiche Objekt zu fungieren scheinen, besteht darin, dass beim Aufruf einer nicht vorhandenen Methode für die SessionManager dieser Methodenaufruf an die Standardsitzung Store weitergeleitet wird.

In Ihrem Beispiel verwenden Sie also die Methode exists() . Diese Methode existiert nicht für SessionManager . Wenn Sie also session()->exists('user_id') aufrufen würden, würde dieser Aufruf an die Standardsitzung Store weitergeleitet, was dem Aufruf von $request->session()->exists('user_id') entspricht.

Man könnte argumentieren, dass die direkte Verwendung von $request->session() geeigneter ist, wenn versucht wird, auf die Sitzungsdaten zuzugreifen, da dies zurückgegeben wird und der zusätzliche Weiterleitungsfunktionsaufruf nicht erforderlich ist. Es liegt jedoch an Ihnen, die Vor- und Nachteile abwägen, um zu bestimmen, welche Methode zu verwenden.

    
patricus 07.10.2017 07:04
quelle