2009-09-17 3 views
5

これは非常に簡単です。私はZend_Authストレージはどのように動作しますか?

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

を書いて、

$user = $auth->getIdentity(); 

が空であるので、私はこの$のユーザーをロードするために別のプロセスで、したいが、私はできません。私はちょうど...それを設定しませんでしたか?なぜそれは機能しませんか?ハープ?

[EDIT 2011-04-13]

これは、ほぼ2年前に頼まれました。しかし、私は2010年7月にこの質問を繰り返し、私が戻ってきて、理解していないという素晴らしい答えを得ました。

リンク:私は以来、私はZend_Authに同じストレージエンジンを使用しますが、すべて悪いを回避し、すべての私のプロジェクトに(時には、余分な微調整して)を使用し非常に素晴らしいリッテクラスを構築していZend_Auth fails to write to storage

<?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

もう1つの問題は、ストレージ(とZend_Auth)が同じ設定をしていないことが考えられます。ある場所に書く、別の場所を読む。 – AsTeR

答えて

1

これは動作するはずです。

ここに、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(); 
} 

は、PHPのセッションストレージが読み書き機能の実装です:

/** 
* 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; 
} 

は、あなたがにZend_Authクラスの同じインスタンスをロードしていますか?

あなたはたぶん、あなたはgetIdentityメソッドの後にwriteメソッドを呼び出している

$auth = Zend_Auth::getInstance(); 

を使用していますか?

とにかく、私が前に言ったように、あなたがやっていることはうまくいくはずです。

+0

まあ、私はこの事ですべての種類の実験をしたと思います。私が得たのは精神的挫傷でした。基本的には、私は本を読んだ後、改訂してから書き直してから、抽象的なランダムな実験をして、一貫した結論に至らなかった。ストレージを更新するとき、それは機能しましたが、ユーザーが同じページに着いた場合にのみ、次のリフレッシュに最後に使用できるようになりました。リダイレクトがあった場合、別のクラスをロードしたり、ストレージを更新したりするクラスに属していないとうまくいかないでしょう。 私の結論は、このランダムなことです。しかし、ありがとう。 – John

+0

設定を確認するだけで直接ストレージが機能します。このメソッドを使用して、切断時にIDを強制的にデバッグモードにして、オープンIDログインページでログインできます。私はこれがセッションの問題であると考えています。 – Jai

0

ページをリロードすると、セッションを取得できますが、リダイレクトしないとセッションは取得できますか?あなたは別のドメイン名でリダイレクトしていますか?その後、Cookieに関する問題が発生する可能性があり、session.cookie_domain ini変数を手動で設定する必要があります。

PHPSESSIDという名前のCookieが正しく設定されているかどうか、そしてすべてのページリクエストでサーバーに送信されているかどうかを確認しますか?それは一定ですか、それとも毎回要求に応じて変わりますか?

また、セッションデータがディスクに正しく保存されているかどうかを確認することもできます。セッションはini変数session.save_pathで定義されたディレクトリにあります。ファイルはあなたのPHPSESSIDに対応していますか?意味のあるエントリが含まれていますか?

register_shutdown_function('session_write_close'); 

インデックスへ:私の場合、それは

[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、それは同じドメインです。私はクッキーをチェックアウトします。この時までには、地球温暖化を含むほとんどあらゆるものになる可能性がほとんどあります。 – John

0

の追加が含まれています。php before:

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

これは役に立たなかった –

関連する問題