2012-01-30 22 views
6

Chcę wiedzieć, jak używać zmiennej sesji PHP w Zend Frameworkjak używać zmiennej sesji PHP w Zend Framework

tutaj jest mój kod do tej pory: -

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; 

    } 

teraz chcę zapisać nazwę użytkownika w sesji i chcę użyć na innej stronie, takiej jak

echo "welcome," .$this->username; co mogę zrobić?

Odpowiedz

6

Zamiast pisać $identity do $authStorage, można zapisać niestandardowy obiekt lub model.

Oto przykład:

<?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]); 
    } 
} 

Teraz w kontrolerze logowania można zrobić:

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 

Zazwyczaj mam obiektu konta, który ja również przechowywać w obiekcie UserSession i uczynić łatwy dostęp do nazwy użytkownika i identyfikatora użytkownika za pośrednictwem właściwości publicznych.

Teraz w każdej chwili można uzyskać obiektu:

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

Tylko nie zapomnij, aby upewnić się, że jest to Application_Model_UserSession.

+0

Kocham swoją odpowiedź, ale może być trochę przesada na to pytanie. ;) – RockyFord

+0

@ drew010 :) fajna odpowiedź – John

4

Mimo że można utworzyć obiekt klasy Zend_Session, jednak zalecałbym obiekt Zend_Session_Namespace. Można instancji sesji jak:

 

$sess = new Zend_Session_Namespace('MyNamespace'); 
 

Jeśli nie zdać, Zend nazw sesji przeniesie swoje imię ciąg „default”. do przechowywania wartości, należy wykonać następujące czynności:

 

$sess->username = 'you_name'; 
 

Później w kodzie, należy wykonać następujące czynności, aby pobrać wartość z sesji:

 

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

nadzieję, że pomoże

4

W tym przypadku powinno być tak proste, jak w dalszym ciągu dodawać dane do $ authStorage:

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

później w innej akcji lub kontrolera można użyć Zend_Auth :: getStorage przypomnieć swoje dane lub użyj Zend_Session_Namespace.

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

lub

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

Po prostu, jeśli "napiszesz" do pamięci więcej niż jeden raz, to zastąpi ona poprzednią wartość, więc przechowywanie obiektu lub stdClass byłoby sposobem na to, abyś mógł zmienić właściwości obiektu. – drew010

+0

@ draw010 Pamiętam to. Wydaje się, że właściwą metodą byłoby przechowywanie wszystkiego w pamięci za pomocą jednego polecenia zapisu.Myślę, że będę musiał z tym eksperymentować. Dzięki za wskazówkę. – RockyFord