Zend Framework Session

Introduzione
Session è una parola familiare nella programmazione PHP. Quando si costruisce un’applicazione complessa, di solito, coinvolgiamo una sessione. In PHP, conosciamo $ _SESSION. Rappresenta uno stato persistente e logico del dato e l’agente client utente (ad esempio, browser web).
A Zend Framework, possiamo usare Zend_Session. Zend_Session gestisce, lato server, i dati memorizzati in $ _SESSION. E una importante classe che dobbiamo conoscere è Zend_Session_Namespace. LA sessione del Namespace fornisce l’accesso ai dati di sessione tramite i namespace classico implementato logicamente come nome di gruppi in array associativi, con chiave di stringhe (simile al normale array in PHP). Qui di seguito, cito dal manuale Zend Framework:
Le istanze di Zend_Session_Namespace sono oggetti che hanno metodi per accedere alle sezioni dello spazio dei nomi della variabile di sessione $_SESSION. Il componente Zend_Session avvolge l’esistente funzionalità di PHP per ext/session con un interfaccia di amministrazione e gestione, inoltre fornisce un’API per le Zend_Session_Namespace per farlo persistente nello spazio dei nomi della sessione. Zend_Session_Namespace fornisce una interfaccia standardizzata, object-oriented, per lavorare con lo spazio dei nomi in modo persistente all’interno meccanismo sessione standard di PHP. Esiste il supporto per entrambi (anonimi e autenticati – ad esempio, “login”) spazi dei nomi della sessione. Zend_Auth, il componente di autenticazione di Zend Framework, utilizza Zend_Session_Namespace per memorizzare alcune informazioni associate a utenti autenticati. Dal Zend_Session si utilizza le normali funzioni di PHP ext/session internamente, tutte le opzioni di configurazione familiare e impostazioni vengono applicate (vedi http://www.php.net/session), con i bonus come ad esempio la comodità di avere un’interfaccia object-oriented e un comportamento di default che fornisce le best practices e l’integrazione con lo Zend Framework. Quindi, uno standard identificativo di sessione in PHP, trasmessa dal cookie o all’interno degli URL, mantiene l’associazione tra un client e i suoi dati dello stato sessione.
Ancora confUSIONE? Non preoccupatevi, Nel prossimo post cercheremo di fare un po’ di pratica con la sessione con Zend Framework. Inizieremo con Zend_Session_Namespace.
Usando Namespace
In questo post, impareremo a usare lo spazio dei nomi in una sessione in Zend Framework. Se non si ha familiarità con lo spazio dei nomi, non ti preoccupare. È semplice. Facciamolo.
Semplicemente, è come il nome dei gruppi di array associativi, con chiavi rappresentate da stringhe. Per fare pratica, usiamo il nostro esercizio precedente.
Ok, vogliamo contare il numero vi volte che si fa’ una richiesta di pagina particolare di form di un visitatore. Vedere l’immagine:
count number of page request
Per fare questo, aprire il file UserController.php sotto la cartella application/controller. Includere Zend/Session/Namespace.php in prima linea dopo il delimitatore.
Copia codice

require_once 'Zend/Session/Namespace.php';
Modificare loginformAction() per farlo diventare come segue:
Copia codice

  public function loginFormAction()
  {
    $request = $this->getRequest();  
    $ns = new Zend_Session_Namespace('ciaoMondo');
	if(!isset($ns->yourLoginRequest)){
	  $ns->yourLoginRequest = 1;
	}else{
	  $ns->yourLoginRequest++;
	}
	$this->view->assign('request', $ns->yourLoginRequest);
	$this->view->assign('action', $request->getBaseURL()."/user/auth");
    $this->view->assign('title', 'Login Form');
    $this->view->assign('username', 'Nome Utente');
    $this->view->assign('password', 'Password');	
  }
Alla linea 5, si definisce oggetto namespace. Lo spazio dei nomi, che abbiamo chiamato “ciaoMondo”. È come $_SESSION['ciaoMondo']. Si può mettere il nome come MioNamespace, MiApplicazione, ecc
Poi, alla riga 7, si verifica il valore di $ns->yourLoginRequest. È come $_SESSION['ciaoMondo']['yourLoginRequest']. Successivamente, modificare loginform.phtml sotto la cartella application/views/scripts/user. Aggiornandolo diventa come segue:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  Sei entrato in questa pagina: <?=$this->escape($this->request);?> volte.
  <form method='post' action='<?=$this->escape($this->action);?>'>
  <table>
    <tr>
	  <td><?=$this->escape($this->username);?></td>
	  <td><input type='text' name='username'></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->password);?></td>
	  <td><input type='password' name='password'></td>
	</tr>
  </table>
  <input type='submit' name='login' value='Login'>
  </form>
<? include "footer.phtml"; ?>
Ora, puntare il browser su http://localhost/test/zend/ciaoMondo/web_root/user/loginform. Si può ottenere le schermate come l’immagine di sopra.Ok, prova di nuovo con userPageAction() nelcontroller. L’aggiornamento apparirebbe come segue:
Copia codice

  public function loginformAction()
  {
    $request = $this->getRequest();  
    $ns = new Zend_Session_Namespace('CiaoWorld');
	if(!isset($ns->yourLoginRequest)){
	  $ns->yourLoginRequest = 1;
	}else{
	  $ns->yourLoginRequest++;
	}
	$this->view->assign('request', $ns->yourLoginRequest);
	$this->view->assign('action', $request->getBaseURL()."/user/auth");
    $this->view->assign('title', 'Login Form');
    $this->view->assign('username', 'Nome Utente');
    $this->view->assign('password', 'Password');
  }
Poi, aggiornare la sua view a application/views/scripts/user/userpage.phtml:
Copia codice

<? include "header.phtml"; ?>
<h1>Ciao, <?=$this->escape($this->real_name);?></h1>
Sei entrato in questa pagina: <?=$this->escape($this->request);?> volte.
<a href='<?=$this->escape($this->urllogout);?>'>Logout</a>
<? include "footer.phtml"; ?>
Accedendo ai dati di Session
In questo post, impareremo ad accedere ai dati di sessione. Ora, si spiega come accedere alla sessione.
Si prega di prestare attenzione al codice del precedente capitolo:
Copia codice

$ns = new Zend_Session_Namespace('ciaoMondo');
if(!isset($ns->yourLoginRequest)){
  $ns->yourLoginRequest = 1;
}else{
  $ns->yourLoginRequest++;
}
Da sopra, sappiamo come impostare la sessione in Zend Framework. Basta dare le proprietà come:
Copia codice

$ns->yourLoginRequest = 1;
$ns->thisIsSession = "Oke";
$ns->nameOfSession = "MiaSession";
$ns->foo = 10;
Ora, come accedere ai valori? Semplice:
Copia codice

echo $ns->yourLoginRequest;
echo $ns->thisIsSession;
echo $ns->nameOfSession;
echo $ns->foo;
Vedere tutti i valori del Namespace
Questo è un piccolo suggerimento per mostrare tutti i valori di uno spazio dei nomi. Come sappiamo, la sessione può avere un comportamento come un array. Quindi, possiamo mostrare valori come se fosse un array. Guardate questo esempio:
Copia codice

$ns = new Zend_Session_Namespace('ciaoMondo');
foreach ($ns as $index => $value) {
  echo "ns->$index = '$value';";
}
Ok, prova a testarlo. Abbiamo messo la sessione nella pagina loginform e nella pagina utente. Ora, vogliamo mostrare le statistiche di richiesta per quella pagina. Aprite il file “UserController.php” sotto la cartella application/controller. Aggiungere il seguente metodo:
Copia codice

  public function statsAction()
  {
    $ns = new Zend_Session_Namespace('ciaoMondo');
    foreach ($ns as $index => $value) {
echo "ns->$index = '$value';";
	  echo "<br />";
    }
  }
Quindi, creare una view per quest’azione sul controller. Creare un file denominato “stats.phtml” sotto la cartella application/views/scripts/user. Lasciare la pagina vuota.
Ok, prova ora a puntare il browser su http://localhost/test/zend/ciaoMondo/web_root/user/stats. Si può ottenere come ad esempio:
Copia codice

ns->yourLoginRequest = '2';
ns->yourUserPageRequest = '7';
I valori dipendono dal numero di visite.
Blocco e sblocco del Namespace
Le sessioni del Namespace possono essere chiuse a chiave. Che cosa significa? Quando un namespace di una sessione è bloccata, non si può aggiornare o eliminare il valore della sessione. Sarà di sola lettura.
Possiamo usare lock() per bloccare lo spazio dei nomi. Poi, se volete controllare se è bloccato o no, possiamo usare il booleano isLocked(). Guardate questo esempio:
Copia codice

  public function loginFormAction()
  {
    $ns = new Zend_Session_Namespace('ciaoMondo');
	$ns->lock();
    if (!$ns->isLocked()) {
	  if(!isset($ns->yourLoginRequest)){
	    $ns->yourLoginRequest = 1;
	  }else{
	    $ns->yourLoginRequest++;
	  }
    }
    $request = $this->getRequest();
	$this->view->assign('request', $ns->yourLoginRequest);
	$this->view->assign('action', $request->getBaseURL()."/user/auth");
    $this->view->assign('title', 'Login Form');
    $this->view->assign('username', 'Nome Utente');
    $this->view->assign('password', 'Password');	
  }
Per aprirlo, possiamo usare il metodo unLock().
Copia codice

$ns= new Zend_Session_Namespace('CiaoWorld');
// blocca la sessione e diventa di sola lettura
$ns->lock();
// sblocca la sessione di sola lettura
if ($ns->isLocked()) {
    $ns->unLock();
}
Scadenza automatica
Possiamo impostare un tempo limitato di validità per uno spazio dei nomi. Per questa caratteristica, realizzaremo unaa scadenza dello spazio dei nomi. Esempio, vogliamo contare il numero di richiesta di pagina da una persona in un minuto. Dopo 1 minuto, sarà contato come persona nuova. Quindi, il codice sarà come questo:
Proviamo ad modificare il metodo loginform del file UserController.php sotto la cartella application/controller. Aggiorniamo loginformAction():
Copia codice

  public function loginformAction()
  {
    $ns = new Zend_Session_Namespace('ciaoMondo');
	if(!isset($ns->yourLoginRequest)){
	    $ns->yourLoginRequest = 1;
	}else{
	    $ns->yourLoginRequest++;
	}
	$ns->setExpirationSeconds(60);
    $request = $this->getRequest();
	$this->view->assign('request', $ns->yourLoginRequest);
	$this->view->assign('action', $request->getBaseURL()."/user/auth");
    $this->view->assign('title', 'Login Form');
    $this->view->assign('username', 'Nome Utente');
    $this->view->assign('password', 'Password');
  }
È possibile impostare solo in una chiave particolare (ad esempio, yourLoginRequest):
Copia codice

$ns->setExpirationSeconds(60,'yourLoginRequest');