webman oturum yönetimi

Örnek

<?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'));
    }
}

$request->session(); ile Workerman\Protocols\Http\Session örneğini elde edin ve örneğin yöntemlerini kullanarak oturum verilerini ekleyin, değiştirin veya silin.

Dikkat: oturum nesnesi yok olduğunda oturum verileri otomatik olarak kaydedilir, bu nedenle $request->session() ile dönen nesneyi küresel bir diziye veya sınıf üyelerine kaydedip oturumun kaydedilememesine neden olmayın.

Tüm oturum verilerini alma

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

Bu, bir dizi döndürür. Eğer hiç oturum verisi yoksa, boş bir dizi döndürülür.

Oturumdan bir değeri alma

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

Eğer veri yoksa, null döndürülür.

get yöntemine ikinci bir parametre olarak bir varsayılan değer de verebilirsiniz. Eğer oturum dizisinde ilgili değer bulunamazsa varsayılan değer döner. Örneğin:

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

Oturum verisi depolama

Bir veri öğesini saklamak için set yöntemini kullanın.

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

set bir değer döndürmez, oturum nesnesi yok olduğunda oturum otomatik olarak kaydedilir.

Birden fazla değeri saklamak için put yöntemini kullanın.

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

Aynı şekilde, put da bir değer döndürmez.

Oturum verilerini silme

Bir veya daha fazla oturum verisini silmek için forget yöntemini kullanın.

$session = $request->session();
// Bir öğeyi sil
$session->forget('name');
// Birden fazla öğeyi sil
$session->forget(['name', 'age']);

Ayrıca sistem, delete yöntemini sağlar. forget yönteminden farkı, delete yalnızca bir öğeyi silebilir.

$session = $request->session();
// $session->forget('name') ile aynıdır;
$session->delete('name');

Oturumdan bir değeri alma ve silme

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

Aşağıdaki kod ile aynı etkiye sahiptir:

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

Eğer ilgili oturum yoksa, null döner.

Tüm oturum verilerini silme

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

Bir değer döndürmez, oturum nesnesi yok olduğunda oturum depolamadan otomatik olarak silinir.

İlgili oturum verisinin var olup olmadığını kontrol etme

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

Yukarıdaki durum, ilgili oturum yoksa veya ilgili oturum değeri null ise false döndürür, aksi takdirde true döner.

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

Yukarıdaki kod da oturum verisinin var olup olmadığını kontrol etmek için kullanılır, farkı ilgili oturum öğe değeri null olduğunda da true döndürmesidir.

Yardımcı fonksiyon session()

webman, aynı işlevselliği sağlamak için session() yardımcı fonksiyonunu sunar.

// Oturum örneğini almak
$session = session();
// Eşdeğerdir
$session = $request->session();

// Bir değer almak
$value = session('key', 'default');
// Eşdeğerdir
$value = session()->get('key', 'default');
// Eşdeğerdir
$value = $request->session()->get('key', 'default');

// Oturuma değer atamak
session(['key1'=>'value1', 'key2' => 'value2']);
// Eşdeğerdir
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Eşdeğerdir
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

Konfigürasyon dosyası

Oturum konfigürasyon dosyası config/session.php içindedir, içeriği aşağıdaki gibi görünür:

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

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

    // handler FileSessionHandler::class ise değeri file,
    // handler RedisSessionHandler::class ise değeri redis
    // handler RedisClusterSessionHandler::class ise değeri redis_cluster yani redis kümesi
    'type'    => 'file',

    // Farklı handler'lar farklı konfigürasyon kullanır
    'config' => [
        // type file olduğunda konfigürasyon
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // type redis olduğunda konfigürasyon
        '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', // session_id'yi saklamak için çerez adı
    'auto_update_timestamp' => false,  // oturumu otomatik olarak yenilemek için, varsayılan kapalı
    'lifetime' => 7*24*60*60,          // oturumun süresi
    'cookie_lifetime' => 365*24*60*60, // session_id'nin çerezinin süresi
    'cookie_path' => '/',              // session_id'nin çerez yolu
    'domain' => '',                    // session_id'nin çerez alanı
    'http_only' => true,               // httpOnly'yi açıp kapatmak için, varsayılan açık
    'secure' => false,                 // yalnızca https altında oturumu açmak için, varsayılan kapalı
    'same_site' => '',                 // CSRF saldırılarını ve kullanıcı takibini önlemek için, seçenekler: strict/lax/none
    'gc_probability' => [1, 1000],     // oturumun geri kazanım olasılığı
];

Güvenlik ile ilgili

Oturum kullanırken, sınıfın örnek nesnelerini doğrudan saklamanız önerilmez, özellikle kontrol edilemeyen sınıf örnekleri kullanılıyorsa, tersine serileştirme sırasında potansiyel riskler olabilir.