Session - Jet\Session

Pro práci se session je v Jet aplikacích doporučeno používat třídu Jet\Session. Na rozdíl od Jet\Http_Request neznemožňuje přístup k superglobálnímu poli. Tedy $_SESSION je možné i nadále používat, ale určitě je lepší práci se session unifikovat a používat tuto třídu.

Použití session

Jmenný prostor

Třída Jet\Session zavádí pojem jmenný prostor (namespace) session. Smyslel je, aby v rámci velké a ideálně modulární aplikace byla snížena šance kolize dat v rámci session.

Koukněme se na příklad: Auth kontroler potřebuje mít v session ID přihlášeného uživatele. Klíč si nazve například "user_id". To je v pořádku až na takový dosti podstatný detail. V aplikaci nemáte jeden, ale třeba dva auth kontolery. Jeden pro přihlášení do administrace, druhý pro přihlášení návštěvníka webu (či zákazníka e-shopu a tak dále). A je jasné, že user_id v session jednoho kontroleru je úplně něco jiného než user_id v session kontroleru druhého.

Je tedy nutné takové situace nějak řešit a jednotlivé session od sebe izolovat - vytvořit v session jmenné prostory.

Asi vás napadne: no jo, ale co když dvě komponenty aplikace použijí stejný prostor a nebude to záměr? To se může stát. Předchází se tomu tak, že název jmenného prostoru session by měl být co nejvíce vázán na danou situaci. Například auth kontroler administrace použije jmenný prostor auth_admin a auth kontroler pro web použije auth_web. A to je již podstatě nižší pravděpodobnost kolize, než když si "něco" v session udělá klíč user_id. Je tedy nutné volit názvy jmenných prostorů session tak, aby bylo jasné k čemu a proč se daná session váže. A například pro aplikační moduly se nabízí použít název modulu pro název jmenného prostoru session a tak dále.

Zápis a čtení

Pro práci se session je potřeba vytvořit instanci Jet\Session. Jediným parametrem je název jmenného prostoru session.

Zápis do session se pak provádí takto:

$session = new Session('my-namespace');
$session->setValue('my-value'$some_value);

Čtení ze session se provádí takto:

$session = new Session('my-namespace');
$some_value $session->getValue('my-value''default-value');

Na rozdíl od Jet\Http_Request Session neprovádí žádné kontroly typů a tak dále. Je to z toho důvodu, že v rámci session nemáte pracovat s uživatelskými vstupy, přesněji řečeno určitě ne s neověřenými a nevalidovanými uživatelskými vstupy. Práce se session je natolik nízkoúrovňová, že lze očekávat práci s důvěryhodnými daty. Například určitě do session nezapíšete ID přihlášeného uživatele pokud si nejste jistí, že uživatel je opravdu přihlášený a ID je platné. A pokud by někdo do session chtěl zapsat něco nevalidovaného, tak už nepomůže ani svěcená voda, natož kontrola typů dat.

Validace session

Jet session umožňuje vložit validátor session. Prakticky je to jednoduché. Někde v inicializaci aplikace můžete provést například toto:

Session::setSessionValidator(function() : bool {
    
    if(empty(
$_SESSION['client_ip'])) {
        
$_SESSION['client_ip'] = Http_Request::clientIP();
        return 
true;
    }
    
    if(
$_SESSION['client_ip'] != Http_Request::clientIP()) {
        return 
false;
    }
    
    
// ... check something ...
    
    
return true;
});

Tedy vložit jakoukoliv logiku, která pomůže ověřit platnost session a volá se bezprostředně po té co je session zahájena (po volání session_start() ).

Taková anonymní funkce musí vrátit bool a pokud vrátí false, pak dojde k zneplatnění session.

Jet neobsahuje žádné předdefinované validátory. Je žádoucí, aby si každá aplikace ideálně zvolila svůj vlastní mechanismus validace session (pokud validaci session budete používat).

Přehled metod třídy Jet\Session

Obecné metody pro práci se session

Metoda Význam
public static setSessionValidator(
callable $session_validator
): void
Nastaví validátor session.
public static getSessionValidator(
): callable
Vrátí validátor session.
public static regenerateId(
): void
Vynutí přegenerování ID session.
public static destroy(
): void
Zneplatní session.
public static getSessionId(
): string
Vrátí ID session.

Metody pro práci s jmenným prostorem session

Metoda Význam
public __construct(
string $namespace
)
Parametrem kontruktoru musí být název jmenného prostoru session.
public getNamespace(
): null|string
Vrátí název jmenného prostoru session dané instance.
public setValue(
string $key,
mixed $value
): void
Nastaví hodnotu dat v jmenném session.
public unsetValue(
string $key
): void
Odstraní hodnotu z jmenného prostoru session.
public getValueExists(
string $key
): bool
Ověří zda hodnota existuje.
public getValue(
string $key,
mixed $default_value = null
): mixed
Vrátí hodnotu a pokud ještě nebyla nastavena, pak vrátí výchozí hodnotu.
public reset(
): void
Vyresetuje daný jmenný prostor (ale pouze daný jmenný prostor - ne celou session). Tedy odstraní ze session všechny příslušné hodnoty.
Předchozí kapitola
Chybové stránky - Jet\ErrorPages
Další kapitola
Logger - Jet\Logger