2012-01-30 18 views
6

Quiero saber cómo utilizar variable de sesión PHP en Zend Frameworkcómo usar variable de sesión PHP en Zend Framework

aquí es mi código hasta ahora: -

public function loginAction() 
    { 
     $this->view->title = 'Login'; 
     if(Zend_Auth::getInstance()->hasIdentity()){ 
      $this->_redirect('index/index'); 
     } 

      $request = $this->getRequest(); 
      $form = new Default_Form_LoginForm(); 
      if($request->isPost()){ 
      if($form->isValid($this->_request->getPost())){ 
       $authAdapter = $this->getAuthAdapter(); 

       $username = $form->getValue('username'); 
       $password = $form->getValue('password'); 

       $authAdapter->setIdentity($username) 
          ->setCredential($password); 

       $auth = Zend_Auth::getInstance(); 
       $result = $auth->authenticate($authAdapter); 

       if($result->isValid()){ 
        $identity = $authAdapter->getResultRowObject(); 

     print_r($authAdapter->getResultRowObject()); 

        $authStorage = $auth->getStorage(); 
        $authStorage->write($identity); 

     echo $authAdapter->getIdentity() . "\n\n"; 

      //   $this->_redirect('index/index'); 
       } else { 
        $this->view->errorMessage = "User name or password is wrong."; 
       } 
      } 
     } 


     $this->view->form = $form; 

    } 

ahora quiero almacenar nombre de usuario en sesión y quiero usar en alguna otra página como

echo "welcome," .$this->username; ¿qué puedo hacer?

Respuesta

6

En lugar de escribir $identity en $authStorage, puede almacenar un objeto personalizado o un modelo.

Aquí se muestra un ejemplo:

<?php 

class  Application_Model_UserSession 
implements Zend_Acl_Role_Interface 
{ 
    public $userId; 
    public $username; 

    /** @var array */ 
    protected $_data; 

    public function __construct($userId, $username) 
    { 
     $this->userId = $userId; 
     $this->username = $username; 
    } 

    public function __set($name, $value) 
    { 
     $this->_data[$name] = $value; 
    } 

    public function __get($name) 
    { 
     if (array_key_exists($name, $this->_data)) { 
      return $this->_data[$name]; 
     } else { 
      return null; 
     } 
    } 

    public function updateStorage() 
    { 
     $auth = Zend_Auth::getInstance(); 
     $auth->getStorage()->write($this); 
    } 

    public function getRoleId() 
    { 
     // TODO: implement 
     $role = 'guest'; 
     return $role; 
    } 

    public function __isset($name) 
    { 
     return isset($this->_data[$name]); 
    } 

    public function __unset($name) 
    { 
     unset($this->_data[$name]); 
    } 
} 

Ahora en su controlador de acceso que puede hacer:

if($result->isValid()){ 
    $identity = new Application_Model_UserSession(0, $username); // 0 for userid 

    // You can also store other data in the session, e.g.: 
    $identity->account = new Account_Model($authAdapter->getResultRowObject()); 

    $identity->updateStorage(); // update Zend_Auth identity with the UserSession object 

Normalmente, tengo un objeto de cuenta de que también puedo almacenar en el objeto UserSession, y hacer fácil acceso al nombre de usuario y userId a través de propiedades públicas.

Ahora bien, en cualquier momento se puede obtener el objeto:

$identity = Zend_Auth::getInstance()->getIdentity(); // Application_Model_UserSession 

Pero no se olvide para asegurarse de que es un Application_Model_UserSession.

+0

Me encanta su respuesta, pero podría ser un poco excesivo para esta pregunta. ;) – RockyFord

+0

@ drew010 :) nice answer – John

4

Aunque puede crear el objeto de clase Zend_Session, en su lugar recomendaría el objeto Zend_Session_Namespace. Usted puede crear una instancia de sesión como:

 

$sess = new Zend_Session_Namespace('MyNamespace'); 
 

Si no pase, Zend Sesión Espacio de nombres asignará su nombre de una cadena “por defecto”. para almacenar valores, tendrá que hacer lo siguiente:

 

$sess->username = 'you_name'; 
 

adelante en el código, usted tendrá que hacer lo siguiente para recuperar el valor de la sesión:

 

$session = new Zend_Session_Namespace('MyNamespace'); 
$userName = $sess->username; 
 

creo que sirve

4

En este caso, debería ser tan simple como continuar para añadir los datos a su authStorage $:

$authStorage = $auth->getStorage(); 
$authStorage->write($identity); 
$authStorage->write($username); 

posterior en otra acción o controlador que puede utilizar Zend_Auth :: getStorage recordar sus datos o use Zend_Session_Namespace.

$authStorage = $auth->getStorage(); 
    $authStorage->read($identity); 
    $authStorage->read($username); 

o

$session = new Zend_Session_Namespace('Zend_Auth'); //Zend_Auth uses Zend_Session_Namespace for storage 
$username = $session->username; 
+0

Solo una nota, si 'escribe' en el almacenamiento más de una vez, sobrescribirá el valor anterior, por lo que almacenar un objeto o stdClass sería el camino a seguir para que pueda cambiar el las propiedades del objeto – drew010

+0

@ drew010 Lo recuerdo. Parece que la forma correcta sería almacenar todo en almacenamiento usando una declaración de escritura.Creo que tendré que experimentar con esto un poco más. Gracias por el consejo. – RockyFord