Pourquoi vouloir étendre Zend_Auth ?
Dans mon cas, il s’agissait initialement de plusieurs applications situées sur le même serveur auxquelles on pouvait se connecter au cours de la même session avec des logins différents. Ces applications partageaient les mêmes librairies, le même bootstrap.
Et ensuite d’avoir un accès simple aux données d’authentification.
Vous allez vous dire pourquoi étendre Zend_Auth
pour si peu ou encore pourquoi écrire un article sur tout ceci. Principalement parce que Zend_Auth
est un singleton et qu’étendre un singleton nécessite de bien comprendre son fonctionnement.
Étendre un singleton
Extrait de Wikipédia :
Le singleton est un patron de conception (design pattern) dont l’objet est de restreindre l’instanciation d’une classe à un seul objet
Quand on veut étendre un singleton en PHP : il faut donc surtout penser à surcharger la méthode qui permet de récupérer l’instance (souvent getInstance()). Sinon vous récupèrerez une instance de la classe parente.
Code de l’extension
require_once 'Zend/Auth.php'; class Extension_Auth extends Zend_Auth { /** * Name of the actual application * * @var string */ protected static $_application = null; protected static $_infos = null; public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } public static function readInfo($info) { if (null === $info) { return null; } if (null === self ::$_infos) { self ::$_infos = self::getInstance() ->getStorage() ->read() ; } if (isset(self::$_infos->$info)) { return self::$_infos->$info; } else { return null; } } public function getStorage() { if (null === $this->_storage) { require_once 'Zend/Auth/Storage/Session.php'; $this->setStorage(new Zend_Auth_Storage_Session( 'Auth_' . $this->getApplication() )); } return $this->_storage; } public static function setApplication($name) { self::$_application = $name; } public static function getApplication() { return self::$_application; } public function clearIdentity() { parent::clearIdentity(); self::$_infos = null; } }
Utilisation
Dans mon bootstrap, je paramètre le nom de l’application :
Extension_Auth::setApplication('toto');
Dans mes scripts de vues, je peux faire :
Actuellement connecté : <?=Extension_Auth::readInfo('s_first_name')?> <?=Extension_Auth::readInfo('s_last_name')?>