webman Sitzungsverwaltung

Beispiel

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $name = $request->get('name');
        $session = $request->session();
        $session->set('name', $name);
        return response('hello ' . $session->get('name'));
    }
}

Durch $request->session(); erhalten Sie eine Instanz von Workerman\Protocols\Http\Session, mit der Sie Methoden verwenden können, um Sitzungsdaten hinzuzufügen, zu ändern oder zu löschen.

Hinweis: Das session-Objekt speichert die Sitzungsdaten automatisch, wenn es zerstört wird. Bewahren Sie also das von $request->session() zurückgegebene Objekt nicht in einem globalen Array oder in Klassenmitgliedern auf, da dies das Speichern der Sitzung verhindern könnte.

Alle Sitzungsdaten abrufen

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

Es wird ein Array zurückgegeben. Wenn keine Sitzungsdaten vorhanden sind, wird ein leeres Array zurückgegeben.

Einen Wert in der Sitzung abrufen

$session = $request->session();
$name = $session->get('name');

Wenn die Daten nicht vorhanden sind, wird null zurückgegeben.

Sie können auch einen Standardwert als zweiten Parameter an die get-Methode übergeben. Wenn der entsprechende Wert im Sitzungsarray nicht gefunden wird, wird der Standardwert zurückgegeben. Zum Beispiel:

$session = $request->session();
$name = $session->get('name', 'tom');

Sitzung speichern

Um einen bestimmten Datenpunkt zu speichern, verwenden Sie die set-Methode.

$session = $request->session();
$session->set('name', 'tom');

Die set-Methode gibt keinen Wert zurück, die Sitzung wird automatisch gespeichert, wenn das session-Objekt zerstört wird.

Wenn Sie mehrere Werte speichern möchten, verwenden Sie die put-Methode.

$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);

Ebenso hat put keinen Rückgabewert.

Sitzungsdaten löschen

Um bestimmte Sitzungsdaten zu löschen, verwenden Sie die forget-Methode.

$session = $request->session();
// Löschen eines Wertes
$session->forget('name');
// Löschen mehrerer Werte
$session->forget(['name', 'age']);

Zusätzlich bietet das System die delete-Methode an. Der Unterschied zur forget-Methode besteht darin, dass delete nur einen einzelnen Wert löschen kann.

$session = $request->session();
// Entspricht $session->forget('name');
$session->delete('name');

Einen Wert in der Sitzung abrufen und löschen

$session = $request->session();
$name = $session->pull('name');

Das Verhalten ist dasselbe wie der folgende Code:

$session = $request->session();
$value = $session->get($name);
$session->delete($name);

Wenn die entsprechende Sitzung nicht vorhanden ist, wird null zurückgegeben.

Alle Sitzungsdaten löschen

$request->session()->flush();

Es gibt keinen Rückgabewert, die Sitzung wird automatisch aus dem Speicher gelöscht, wenn das session-Objekt zerstört wird.

Überprüfen, ob bestimmte Sitzungsdaten vorhanden sind

$session = $request->session();
$has = $session->has('name');

Wenn die entsprechende Sitzung nicht vorhanden ist oder der Wert der Sitzung null ist, wird false zurückgegeben, andernfalls true.

$session = $request->session();
$has = $session->exists('name');

Der obige Code wird ebenfalls verwendet, um zu überprüfen, ob Sitzungsdaten vorhanden sind. Der Unterschied besteht darin, dass auch true zurückgegeben wird, wenn der Wert der entsprechenden Sitzung null ist.

Hilfsfunktion session()

webman bietet die Hilfsfunktion session(), um die gleiche Funktionalität zu erreichen.

// Sitzunginstanz abrufen
$session = session();
// Entspricht
$session = $request->session();

// Einen Wert abrufen
$value = session('key', 'default');
// Entspricht
$value = session()->get('key', 'default');
// Entspricht
$value = $request->session()->get('key', 'default');

// Werte in der Sitzung setzen
session(['key1'=>'value1', 'key2' => 'value2']);
// Entspricht
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Entspricht
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

Konfigurationsdatei

Die Sitzungs-Konfigurationsdatei befindet sich unter config/session.php, der Inhalt sieht ähnlich aus:

use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;

return [
    // FileSessionHandler::class oder RedisSessionHandler::class oder RedisClusterSessionHandler::class 
    'handler' => FileSessionHandler::class,

    // Wenn handler FileSessionHandler::class ist, dann value ist file,
    // Wenn handler RedisSessionHandler::class ist, dann value ist redis
    // Wenn handler RedisClusterSessionHandler::class ist, dann value ist redis_cluster
    'type'    => 'file',

    // Unterschiedliche Handler verwenden unterschiedliche Konfigurationen
    'config' => [
        // Konfiguration, wenn type file
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // Konfiguration, wenn type redis
        'redis' => [
            'host'      => '127.0.0.1',
            'port'      => 6379,
            'auth'      => '',
            'timeout'   => 2,
            'database'  => '',
            'prefix'    => 'redis_session_',
        ],
        'redis_cluster' => [
            'host'    => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
            'timeout' => 2,
            'auth'    => '',
            'prefix'  => 'redis_session_',
        ]

    ],

    'session_name' => 'PHPSID', // Name des Cookies, das die session_id speichert
    'auto_update_timestamp' => false,  // Ob die Sitzung automatisch aktualisiert wird, standardmäßig deaktiviert
    'lifetime' => 7*24*60*60,          // Ablaufzeit der Sitzung
    'cookie_lifetime' => 365*24*60*60, // Ablaufzeit des Cookies, das die session_id speichert
    'cookie_path' => '/',              // Pfad des Cookies, das die session_id speichert
    'domain' => '',                    // Domain des Cookies, das die session_id speichert
    'http_only' => true,               // Ob httpOnly aktiviert ist, standardmäßig aktiviert
    'secure' => false,                 // Sitzung nur über https aktivieren, standardmäßig deaktiviert
    'same_site' => '',                 // Zum Schutz vor CSRF-Angriffen und Benutzerverfolgung, mögliche Werte: strict/lax/none
    'gc_probability' => [1, 1000],     // Wahrscheinlichkeit der Sitzungsgarbage Collection
];

Sicherheitsaspekte

Bei der Verwendung von Sitzungen wird nicht empfohlen, direkt Instanzobjekte von Klassen, insbesondere von nicht kontrollierbaren Klasseninstanzen, zu speichern, da dies bei der Deserialisierung potenzielle Risiken mit sich bringen kann.