Sitzung
- Einführung
- Treibervoraussetzungen BedingungenDaten abrufen
- Get Alle Sitzungen DatenIn Sitzung Daten im Array speichern
- Abrufen & Ein Datenelement löschen
- Sitzung neu generieren ID
- Benutzerdefinierte Sitzung hinzufügen Fahrer
- Fahrer registrieren
file
– Speichern Sie die Sitzung instorage/framework/sessions
.cookie
– Sitzungen werden in sicheren, verschlüsselten Cookies gespeichert.database
– Sitzungen werden in einer relationalen Datenbank gespeichert.memcached
/redis
– Sitzungen werden in einem Cache-basierten Speichersystem gespeichert.array
– Sitzungen werden in PHP-Arrays gespeichert, aber nicht dauerhaft gespeichert.
- Konfiguration
- Globale Hilfsfunktion Sitzung
HTTP Sitzungsmechanismus
Einführung
Wegen HTTP-gesteuerte Anwendungen sind zustandslos, Sitzungen bieten eine Möglichkeit, Informationen über den Benutzer über mehrere Anfragen hinweg zu speichern, und Laravel verarbeitet verschiedene native Backend-Treiber über dieselbe lesbare API. Unterstützt beliebte Datenbanken wie Memcached, Redis und andere.
Konfiguration
Die Konfigurationsdatei der Sitzung wird in der Datei config/session.php
gespeichert. Sehen Sie sich unbedingt die Optionen an, die Ihnen in dieser Datei zur Verfügung stehen. Standardmäßig konfiguriert Laravel den Sitzungstreiber für die meisten Anwendungen als file
. In einer Produktionsumgebung können Sie die Verwendung des Treibers memcached
oder redis
in Betracht ziehen, um die Sitzungsleistung noch zu verbessern. Die Konfiguration von
Sitzung driver
legt den Speicherort fest, an dem Sitzungsdaten für jede Anfrage gespeichert werden. Laravel wird mit mehreren netten und sofort einsatzbereiten Treibern geliefert:
{tip} Array-Treiber werden im Allgemeinen zum Testen und zur Verhinderung der Persistenz der in der Sitzung gespeicherten Daten verwendet.
Treibervoraussetzungen
Datenbank
Bei Verwendung database
Als Sitzungstreiber müssen Sie eine Seite erstellen, die die Sitzung enthält Tabelle mit verschiedenen Daten. Das Folgende ist ein Beispiel für die Verwendung von Schema
zum Erstellen einer Tabelle:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->unsignedInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); });
Sie können den Artisan-Befehl session:table
verwenden, um diese Migration zu generieren:
php artisan session:table php artisan migrate
Redis
Bevor Sie Redis als Sitzungstreiber für Laravel verwenden, müssen Sie das predis/predis
Erweiterungspaket (~1.0) über Composer installieren. Konfigurieren Sie dann die Redis-Verbindungsinformationen in der database
-Konfigurationsdatei. In der session
-Konfigurationsdatei kann mit der Option connection
angegeben werden, welche Redis-Verbindung die Sitzung verwendet.
Sitzung verwenden
Daten abrufen
Laravel Es gibt im Wesentlichen zwei Möglichkeiten, Sitzungsdaten zu verarbeiten: globale Hilfsfunktionen session
und über eine Request
-Instanz. Schauen wir uns zunächst den Zugriff auf die Sitzung über einen Controller-Methodentyphinweis für eine Request
-Instanz an. Controller-Methodenabhängigkeiten werden automatisch über den Laravel-Dienstcontainer eingefügt:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 展示给定用户的配置文件。 * * @param Request $request * @param int $id * @return Response */ public function show(Request $request, $id) { $value = $request->session()->get('key'); // } }
Wenn Sie den Wert aus der Sitzung erhalten, können Sie auch einen Standardwert als zweiten Parameter der get
-Methode übergeben. Wenn der angegebene Schlüssel in der Sitzung nicht vorhanden ist, wird dieser Standardwert zurückgegeben. Wenn ein Abschluss als Standardwert der Methode get
übergeben wird und der angeforderte Schlüssel nicht vorhanden ist, führt die Methode get
den Abschluss aus und gibt ihr Ergebnis zurück:
$value = $request->session()->get('key', 'default'); $value = $request->session()->get('key', function () { return 'default'; });
Globale Hilfsfunktion Sitzung
Sie können auch die globale PHP-Hilfsfunktion session
verwenden, um Sitzungsdaten abzurufen und zu speichern. Wenn die Hilfsfunktion session
mit einem einzelnen Zeichenfolgenwert als Argument aufgerufen wird, gibt sie den Wert des Sitzungsschlüssels zurück, der dieser Zeichenfolge entspricht. Wenn Sie die Hilfsfunktion session
mit einem Array von Schlüssel-Wert-Paaren als Parameter aufrufen, wird der eingehende Schlüsselwert in der Sitzung gespeichert:
Route::get('home', function () { // 获取 session 中的一条数据... $value = session('key'); // 指定一个默认值... $value = session('key', 'default'); // 在 Session 中存储一条数据... session(['key' => 'value']); });
{tip} Manipulieren Sie die Sitzung über eine HTTP-Anforderungsinstanz und verwenden Sie die globale Hilfsfunktion
session
Es gibt keinen wesentlichen Unterschied zwischen den beiden. Beide Methoden können über die in allen Testfällen verfügbare MethodeassertSessionHas
getestet werden.
Alle Sitzungsdaten abrufen
Wenn Sie alle Sitzungsdaten abrufen möchten, können Sie die all
-Methode verwenden:
$data = $request->session()->all();
Schiedsrichtersitzung Ob ein bestimmter Wert in
vorhanden ist. Um festzustellen, ob ein bestimmter Wert in Session vorhanden ist, können Sie die Methode has
verwenden. Wenn der Wert existiert und nicht null
ist, gibt die has
-Methode true
zurück:
if ($request->session()->has('users')) { // }
Sie können feststellen, ob ein Wert in der Sitzung vorhanden ist, auch wenn sein Wert null
ist Verwenden Sie die Methode exists
. Die Methode exists
gibt true
zurück, wenn der Wert vorhanden ist:
if ($request->session()->exists('users')) { // }
Daten speichern
Um Daten in der Sitzung zu speichern, können Sie die Methode put
oder die Hilfsfunktion session
verwenden.
// 通过请求实例... $request->session()->put('key', 'value'); // 通过全局辅助函数... session(['key' => 'value']);
Daten im Sitzungsarray speichern
push
-Methode kann einen neuen Wert zum Sitzungsarray hinzufügen. Angenommen, der Schlüssel user.teams
ist ein Array mit Teamnamen, können Sie dem Array wie folgt einen neuen Wert hinzufügen:
$request->session()->push('user.teams', 'developers');
Ein Datenelement abrufen und löschen
pull
Methode kann nur eine Anweisung verwenden, um das Ergebnis von Session abzurufen Abrufen und Löschen einer Anweisung in:
$value = $request->session()->pull('key', 'default');
Flash-Daten
Manchmal möchten Sie möglicherweise Daten in Sitzung für speichern Bei der nächsten Anfrage können Sie die Methode flash
verwenden. Mit dieser Methode in der Sitzung gespeicherte Daten bleiben nur bis zum Eintreffen der nächsten HTTP-Anfrage erhalten und werden dann gelöscht. Flash-Daten werden hauptsächlich für kurzfristige Statusmeldungen verwendet:
$request->session()->flash('status', 'Task was successful!');
Wenn Sie diese einmaligen Daten in mehreren Anfragen verwenden müssen, können Sie die Methode reflash
verwenden, die alle einmaligen Anfragen behält . zur nächsten Anfrage. Wenn Sie einmalige Daten speichern möchten, können Sie die keep
-Methode verwenden:
$request->session()->reflash(); $request->session()->keep(['username', 'email']);
Daten löschen
forget
Mit dieser Methode werden die angegebenen Daten aus der Sitzung gelöscht. Wenn Sie alle Daten aus der Sitzung löschen möchten, können Sie Folgendes verwenden: flush
Methode:
$request->session()->forget('key'); $request->session()->flush();
Sitzungs-ID neu generieren
Sitzungs-ID neu generieren dient normalerweise dazu, zu verhindern, dass böswillige Benutzer die Sitzung nutzen Fixierung, um Ihre Anwendung anzugreifen.
Wenn Sie die integrierte Funktion LoginController
verwenden, generiert Laravel automatisch die bei der Authentifizierung verwendete Sitzungs-ID neu. Andernfalls müssen Sie die Sitzungs-ID mithilfe der Methode regenerate
manuell neu generieren.
$request->session()->regenerate();
Benutzerdefinierten Sitzungstreiber hinzufügen
Implementieren des Treibers
Ihr angepasster Sitzungstreiber muss die SessionHandlerInterface
-Schnittstelle implementieren. Diese Schnittstelle enthält einige einfache Methoden, die wir implementieren müssen. Das Folgende ist ein Beispiel für den allgemeinen Prozess der MongoDB-Implementierung:
<?php namespace App\Extensions; class MongoSessionHandler implements \SessionHandlerInterface{ public function open($savePath, $sessionName) {} public function close() {} public function read($sessionId) {} public function write($sessionId, $data) {} public function destroy($sessionId) {} public function gc($lifetime) {} }
{tip} Laravel verfügt standardmäßig nicht über ein Verzeichnis für Paketerweiterungen. Sie können es in dem Verzeichnis Ihrer Wahl platzieren. Im obigen Beispiel haben wir ein
Extensions
-Verzeichnis zum Speichern vonMongoSessionHandler
erstellt.
Da die oben genannten Methoden nicht sehr leicht zu verstehen sind, gehen wir die einzelnen Methoden kurz durch:
open
Die Methode wird normalerweise für Datei- basiertes Sitzungsspeichersystem. Denn Laravel kommt bereits mit einemfile
Session-Treiber. Sie müssen also keinen Code in diese Methode einfügen. PHP erfordert eine Implementierung dieser Methode (das ist einfach ein schlechtes Interface-Design), Sie müssen diese Methode einfach leer lassen. Dieclose
-Methode ähnelt deropen
-Methode und kann normalerweise ignoriert werden. Für die meisten Treiber ist diese Methode nicht erforderlich. Die Methoderead
sollte das Zeichenfolgenformat der Sitzungsdaten zurückgeben, das mit dem angegebenen$sessionId
übereinstimmt. Beim Abrufen oder Speichern von Sitzungsdaten in Ihrem benutzerdefinierten Treiber ist keine Serialisierung oder andere Codierung erforderlich, da Laravel die Serialisierung automatisch für Sie durchführt. Diewrite
-Methode schreibt die angegebene$sessionId
-Zeichenfolge, die mit$data
verknüpft ist, in ein persistentes Speichersystem wie MongoDB, Dynamo usw. Auch hier müssen Sie keine Serialisierung oder andere Codierung durchführen, da Laravel dies automatisch für Sie erledigt. Die Methodedestroy
löscht die mit$sessionId
verbundenen Daten aus dem persistenten Speicher. Die Methodegc
zerstört alle Daten vor dem angegebenen$lifetime
(UNIX-Zeitstempel). Bei Systemen, die über einen eigenen Ablaufmechanismus verfügen, wie z. B. Memcached und Redis, kann diese Methode leer gelassen werden.
Registrieren des Treibers
Wenn der Treiber implementiert ist, muss er registriert werden im Rahmen. Um dem Laravel
-Backend zusätzliche Treiber hinzuzufügen, müssen Sie die Session
-Methode der extend
-Fassade verwenden. Sie sollten die Methode boot
in der Methode extend
des Dienstanbieters aufrufen. Sie können diesen Vorgang für einen vorhandenen AppServiceProvider
ausführen oder einen anderen Dienstanbieter erstellen:
<?php namespace App\Providers; use App\Extensions\MongoSessionHandler; use Illuminate\Support\Facades\Session; use Illuminate\Support\ServiceProvider; class SessionServiceProvider extends ServiceProvider{ /** * 执行服务的注册后启动 * * @return void */ public function boot() { Session::extend('mongo', function ($app) { // 返回实现 SessionHandlerInterface 的对象 return new MongoSessionHandler; }); } /** * 在容器中注册绑定关系 * * @return void */ public function register() { // } }
Wenn der Treiber die Registrierung abgeschlossen hat, können Sie den config/session.php
-Treiber in der Konfigurationsdatei mongo
verwenden.