La classe suivante me permet de centraliser la gestion des sessions grâce à Zend_Session
.
class Mp_Session { /** * Name of the actual application * * @var string */ protected static $_application = null; /** * Default namespace * * @var string */ protected static $_default_namespace = 'default'; /** * @var array */ protected static $_session_app = array(); /** * Retourne le namespace de session de l'appli courante * * @param string $namespace * @return Zend_Session_Namespace */ private static function _getSessionApp ($namespace = null) { if ($namespace === null) { $namespace = self::$_default_namespace; } if (! isset(self::$_session_app{($namespace)}) || null === self::$_session_app{($namespace)}) { self::$_session_app{($namespace)} = new Zend_Session_Namespace( self::getApplication() . '_' . ucfirst( strtolower( $namespace))); } return self::$_session_app{($namespace)}; } /** * Lit une variable de session * (de l'application en cours par défaut) * * @param string $cle * @param mixed $alternatif valeur par défaut * @return mixed */ public static function get ($cle, $alternatif = null, $namespace = null) { if ($cle == '') { return null; } $session_app = self::_getSessionApp($namespace); if (isset($session_app->{$cle})) { return $session_app->{$cle}; } else { return $alternatif; } } /** * Détruit une (ou plusieurs) variable de session * */ public static function del ($namespace) { $session_app = self::_getSessionApp($namespace); $cles = func_get_args(); $cles = array_shift($cles); // namespace foreach ($cles as $cle) { unset($session_app->{$cle}); } } /** * Ecrit une variable de session * * @param string $cle * @param mixed $valeur * @return mixed */ public static function set ($cle, $valeur, $namespace = null) { if ($cle == '') { return null; } $session_app = self::_getSessionApp($namespace); $session_app->{$cle} = $valeur; return $valeur; } /** * Ecrit une(des) variable(s) de session * * @param mixed $valeur * @return mixed */ public static function setMulti ($valeurs, $namespace = null) { $session_app = self::_getSessionApp($namespace); $valeurs = (array) $valeurs; while (list ($cle, $valeur) = each($valeurs)) { $session_app->{$cle} = $valeur; } reset($valeurs); return $valeurs; } /** * @param string $name * @return void */ public static function setApplication ($name) { self::$_application = ucfirst(strtolower($name)); } /** * @return string */ public static function getApplication () { return self::$_application; } /** * @param string $name * @return void */ public static function setDefaultNamespace ($name) { self::$_default_namespace = ucfirst(strtolower($name)); } /** * @return string */ public static function getDefaultNamespace () { return self::$_default_namespace; } }
Voyons maintenant son utilisation :
- dans le bootstrap, j’initialise l’application :
Mp_Session::setApplication('MonAppli');
- dans un plugin en preDispatch j’initialise le namespace, dans mon cas il s’agit du module de l’application, s’il n’est pas initialisé sa valeur est « default » ce qui correspond à un namespace global :
Mp_Session::setNamespace($this->getRequest() ->getModuleName());
- dans l’application, je peux écrire des données :
// dans le namespace en cours Mp_Session::set('maVar', 'toto'); // dans le namespace du module Tata Mp_Session::set('maVar', 'toto', 'Tata'); // avec plusieurs variables Mp_Session::setMulti(array('maVar1' => 'toto', 'maVar2' => 'titi')); // ou Mp_Session::setMulti(array('maVar1' => 'toto', 'maVar2' => 'titi') 'Tata');
- ou les lire :
$var = Mp_Session::get('toto'); // ou $var = Mp_Session::get('toto', 'Tata');
Super article!
Mais ca aurait été bien d’avoir des exemples pour supprimer les sessions et les variables de session.
Je ne vois pas comment utiliser la methode del() et comment détruire carrément les sessions entièrement.
En tout cas super boulot, merci.
Dernière chose , il semble y avoir une erreur:
Mp_Session::setNamespace() semble etre Mp_Session::setDefaultNamespace() non?
Pour détruire toute la session utiliser la fonction unsetAll()