1

CWebUserのサブクラスを作成する方法に関するチュートリアルを読み、指示に従いました。パスはすべて機能し、コードは正しいメソッドに入りますが、ゲッターから返される値は常にnilです。

class PersonUser extends CWebUser {

  // Store model to not repeat query.
  private $_person;

  // Load user model.
  public function loadPerson($id=null, $duration=0)
  {
    $this->login($id,$duration);
    $this->_person=Person::model()->findByPk(Yii::app()->user->id);
  }

  public function getPerson()
  {
    return $this->_person;
    //return Person::model()->findByPk($this->id);
  }
}

$this->_person->first_name設定後にloadPersonメソッドでエコーすると、_person期待する値が得られます。ただし、後で要求するYii::app()->user->personと、getPerson()メソッドが呼び出されますが、$this->_person現在はnullになっています。私はそれがそこに入っていることを知っています、私が下の行のコメントを外して、それが毎回人を調べさせるならば、それはうまくいきます。

これはYiiの問題ですか?個人オブジェクトをキャッシュして、データベースをさらに呼び出さなくてもセッション全体で参照できるようにしたいと考えています。何が足りないの?

4

2 に答える 2

3

Yiiには問題はありません。ドキュメントによると、CWebUserクラスは、セッション全体を通じて永続的なままである事前定義された変数「id」と「name」を識別します。追加の変数は、getState()およびsetState()メソッドで使用する必要があります。「さらに、CWebUserは、実際の認証アルゴリズムを実装するIUserIdentityクラスと一緒に使用する必要があります。」

于 2013-03-06T06:55:17.023 に答える
2

メソッドloadUser()が呼び出されることはありません。また、login()内部の呼び出しも意味がありません。のより単純な実装は次のgetPerson()ようになります。

private $_person = false;
public function getPerson()
{
    if($this->_person===false)
        $this->_person = Person::model()->findByPk($this->id);
    return $this->_person;
}
于 2013-03-06T15:47:29.163 に答える