2009-09-17 12 views
5

Questo è molto semplice. ScrivoCome funziona lo spazio di archiviazione di Zend_Auth?

$auth->getStorage()->write($user); 

E poi voglio, in un processo separato per caricare questo $ utente, ma non posso perché

$user = $auth->getIdentity(); 

è vuota. Non l'ho appena ... IMPOSTATO? Perché non funziona? Halp?

[EDIT 2011-04-13]

questo è stato chiesto quasi due anni fa. Il fatto è, tuttavia, che ho ripetuto la domanda nel luglio 2010 e ho ottenuto una risposta fantastica che, a quel tempo, semplicemente non capivo.

Link: Zend_Auth fails to write to storage

allora ho costruito una bella classe litte che uso (a volte con tweaking extra) in tutti i miei progetti utilizzando lo stesso motore di archiviazione come Zend_Auth ma eludere tutte le cattive.

<?php 

class Qapacity_Helpers_Storage { 

    public function save($name = 'default', $data) { 

     $session = new Zend_Session_Namespace($name); 
     $session->data = $data; 

     return true; 
    } 

    public function load($name = 'default', $part = null) { 

     $session = new Zend_Session_Namespace($name); 

     if (!isset($session->data)) 
      return null; 

     $data = $session->data; 

     if ($part && isset($data[$part])) 
      return $data[$part]; 

     return $data; 
    } 

    public function clear($name = 'default') { 

     $session = new Zend_Session_Namespace($name); 

     if (isset($session->data)) 
      unset($session->data); 

     return true; 
    } 

} 

?> 
+0

L'altro problema potrebbe essere che la memoria (e Zend_Auth) non ha la stessa configurazione. Scrivere su un posto, leggere su un altro. – AsTeR

risposta

1

Si suppone che funzioni.

Ecco l'implementazione della funzione Auth getIdentity.

/** 
* Returns the identity from storage or null if no identity is available 
* 
* @return mixed|null 
*/ 
public function getIdentity() 
{ 
    $storage = $this->getStorage(); 

    if ($storage->isEmpty()) { 
     return null; 
    } 

    return $storage->read(); 
} 

Ecco l'attuazione della scrittura PHP Session bagagli e lesse funzioni:

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @return mixed 
*/ 
public function read() 
{ 
    return $this->_session->{$this->_member}; 
} 

/** 
* Defined by Zend_Auth_Storage_Interface 
* 
* @param mixed $contents 
* @return void 
*/ 
public function write($contents) 
{ 
    $this->_session->{$this->_member} = $contents; 
} 

Sei sicuro che si sta caricando la stessa istanza della classe Zend_Auth?

Si sta utilizzando

$auth = Zend_Auth::getInstance(); 

Forse si sta chiamando il metodo di scrittura dopo che il metodo GetIdentity?

In ogni caso, come ho detto prima, quello che stai facendo dovrebbe funzionare.

+0

Beh, penso di aver fatto tutti i tipi di esperimenti con questa cosa e tutto quello che ho ottenuto sono stati i lividi mentali. Fondamentalmente, l'ho fatto dal libro, poi con modifiche, poi con riscritture, poi con esperimenti casuali astratti senza arrivare a conclusioni coerenti. Durante l'aggiornamento dello storage, ha funzionato, ma solo se l'utente è atterrato sulla stessa pagina e sarà finalmente utilizzabile il prossimo aggiornamento. Se avessi un reindirizzamento, non funzionerebbe se non fosse in una classe che ha caricato un'altra classe, che ha aggiornato la memoria ecc. La mia conclusione è che questa merda è assolutamente casuale. Grazie comunque. – John

+0

Giusto per confermare l'impostazione della memoria direttamente funziona per me. Io uso questo metodo per forzare l'identità in modalità debug quando disconnesso, così posso accedere con la mia pagina di login ID aperta. Penso che questo sia un problema di sessione come descritto è il tuo problema più probabile. – Jai

0

Quindi, in una pagina di ricarica è possibile recuperare la sessione, mentre non se il reindirizzamento? Stai reindirizzando su un nome di dominio diverso? Quindi potrebbe essere un problema con i cookie e avresti bisogno di impostare manualmente la variabile ini session.cookie_domain.

Verificare se il cookie denominato PHPSESSID è stato impostato correttamente e se è stato inviato al server in ogni richiesta di pagina? È costante o cambia su ogni richiesta?

Inoltre, è possibile controllare se i dati della sessione vengono correttamente salvati sul disco. Le sessioni possono essere trovate nella directory definita dalla variabile ini session.save_path. Il file corrispondente al tuo PHPSESSID è contenuto e contiene una voce significativa? Nel mio caso contiene

[email protected]:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}} 
+0

Nono, è lo stesso dominio. Controllerò il cookie, comunque. A questo punto sono quasi sicuro che potrebbe essere praticamente qualsiasi cosa, incluso il riscaldamento globale, eh. – John

0

Add:

register_shutdown_function('session_write_close'); 

da indicizzare.php before:

$application->bootstrap()->run(); 
+0

Questo non ha aiutato –

Problemi correlati