Nette Framework
  • Úvodní stránka
  • Download
  • Dokumentace
  • Fórum
  • Blog
  • Přispějte
  • Quick Start
    • Začínáme
    • Adresářová struktura
    • Vytvoření presenteru
    • Připojení šablony
    • Tvorba odkazů
    • Hezčí šablony
    • Zobrazení tabulky
    • Stránkování a řazení
    • Tvoříme komponentu
  • Nette\Application
    • Application
    • AppForm
    • Control
    • Presenter
    • PresenterCompo­nent
    • PresenterRequest
    • MultiRouter
    • Route
    • SimpleRouter
  • Nette\Caching
  • Nette\Component
  • Nette\Debug
    • Základy
    • Logování chyb
    • Firebug
  • Nette\Environment
  • Nette\Forms
  • Nette\IO\SafeS­tream
  • Nette\Loaders
  • Nette\Object
  • Nette\Security
    • Bezpečnost aplikací
    • Identity
    • SimpleAuthenti­cator
    • Permission
    • Dynamická správa rolí a zdrojů
  • Nette\String
  • Nette\Templates
    • Template
    • Template Filters
    • Template Helpers
  • Nette\Web\Html
  • Nette\Web\HttpR­equest
  • Nette\Web\HttpR­esponse
  • Nette\Web\Session
  • Nette\Web\User
Naposledy změněno 8. 11. 2008 Edituj Historie Poslední změny

Nette\Web\Session

U webových aplikací je často potřeba uchovávat některé informace, např. o přihlášení uživatele nebo obsahu nákupního košíku, mezi načtením jednotlivých stránek. K tomuto účelu existují session neboli relace. Každý uživatel, který vstoupí na stránku, obdrží jedinečný identifikátor Session ID a ten se předává v cookies. Ten pak slouží jako klíč k session datům. Narozdíl od cookies, které se uchovávají na straně prohlížeče, jsou data v session uchovávána na straně serveru.

V Nette ke správě session slouží třída Nette\Web\Session a manipulaci s daty zajišťuje Nette\Web\SessionNamespace. Pro oddělení vzájemně nesouvisejících session dat se tedy používají jmenné prostory, ve kterých se s nimi pracuje podobně jako s běžným polem v PHP.

Příklad – čítač přístupů

Začněme příkladem počítadla, které ukazuje, kolikrát uživatel zobrazil stránku:

// získáme přístup do jmenného prostoru counter
$namespace = Environment::getSession('counter');

// pokud v něm existuje proměnná $count
if (isset($namespace->count)) {
    // zvětšíme její hodnotu o jedničku
    $namespace->count++;
} else {
    // jinak ji inicializujeme
    $namespace->count = 1;
}

echo 'Počet zhlédnutí: ', $namespace->count;

A teď se podíváme na celou věc pozorněji. Získání přístupu do jmenného prostoru counter:

$session = Environment::getSession();

$namespace = $session->getNamespace('counter');

nebo stručněji

$namespace = Environment::getSession('counter');

Proměnné ve jmenném prostoru

Proměnné se používají jako obyčejné proměnné objektu:

$namespace->a = 'apple';
$namespace->p = 'pear';
$namespace->o = 'orange';

echo $namespace->a;

Pro získání všech proměnných z namespace je možné použít cyklus foreach.

foreach ($namespace as $key => $val) {
    echo "$key = $val<br>";
}

Zrušení proměnné:

unset($namespace->a);

Nastavení expirace

Proměnná a bude smazána po 5 sekundách:

$namespace->setExpiration(5, 'a');

Celý jmenný prostor bude zrušen po uplynutí 60 sekund:

$namespace->setExpiration(60);

Zrušení expirace celého jmenného prostoru (neovlivní explicitně nastavenou expiraci klíče a)

$namespace->removeExpiration();

Expirace proměnné se dá před vypršením zrušit:

$namespace->removeExpiration('a');

Okamžité zrušení celého jmenného prostoru:

$namespace->remove();

Práce se jmennými prostory

Vypsání všech prostoru a jejich proměnných:

$session = Environment::getSession();

foreach ($session as $name) {
    echo "<h2>Namespace $name</h2>";
    foreach (Environment::getSession($name) as $key => $val) {
        echo "<h3>$key</h3>";
        Debug::dump($val);
    }
}

Ověření existence prostoru:

$session = Environment::getSession();
$session->hasNamespace('test'); // TRUE

Konfigurace session

$session = Environment::getSession();

// sezení vyprší po 14 dnech neaktivity
$session->setExpiration(1209600);

// sezení vyprší jakmile uživatel zavře prohlížeč
$session->setExpiration(0);

// nastavení cesty pro ukládání session dat na serveru
// soubory session se hromadí v tomto adresáři, udržuje ho garbage collector
$session->setSavePath(dirname(__FILE__) . '/sessions/');

// nastavení parametrů cookie
$session->setCookieParams($path, $domain = NULL, $secure = NULL);

Tipy k Vašim aplikacím

  • při zavření prohlížeče nechejte vypršet přihlášení uživatele, obsah košíku, oslovení je vhodné nechat
  • zobrazení informačních hlášek o úspěšnosti nějaké akce (například v administraci) je dobré vázat na nějakou session proměnnou v kombinaci s query-stringem. Proměnné v session nastavíme expiraci například 1 minutu a při zobrazení informační hlášky kontrolujeme existenci této proměnné a na základě toho se rozhodneme, zda-li hlášku ještě zobrazit/nezobrazit

Viz také:

  • Nette\Web\Session API reference
  • Nette\Web\Ses­sionNamespace API reference
« Nette\Web\HttpR­esponse Nette\Web\User »

Nette Framework powered | dibi powered | Texy! powered | Institut Školení PHP