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%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)
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);
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.
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
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.
Tags und Links php session dependency-injection laravel-5 laravel