3

エンティティにフォロワーを注入するサービスとしてロードされた Redis を使用します。だから私は getFollowers のようなメソッドを持つ User のようなエンティティを持っています。サービスとエンティティを混在させたくないので、Doctrine で postLoad イベントをサブスクライブするリスナーを作成します。

問題は、getFollowers メソッドを呼び出したときにのみサービスを呼び出す方法です。

私のコード...

イベントリスナー:

public function postLoad(LifecycleEventArgs $eventArgs)
{

    $redisService = get the service loaded with DIC in constructor. 

    if ($eventArgs->getEntity() instanceof User) {
        $user = $eventArgs->getEntity();

        $user->setFollowers($redisService->getFollowers($user));

    }

}

ユーザー エンティティ:

public function setFollowers(Array $followers) {
    $this->followers = $followers
}

私の問題は、クラス ユーザーのすべてのロードで、RedisService が呼び出されてロードされ、$user->getFollowers でのみサービスを呼び出したいことです。

4

2 に答える 2

1

やっと答えが出ます…

リスナー postLoad で、オブジェクトのプロパティにクロージャーを割り当てます。

$socialGraph = $this->socialGraph;
$getFollowers = function() use ($socialGraph, $user) {
    return $socialGraph->getFollowers($user->getId());
};

$user->setFans($getFollowers);

さて、私のオブジェクトでは、メソッドをプロパティに呼び出すことができます:

public function getFans()
{
    return call_user_func($this->fans);

 // another way
    return $this->fans->__invoke();
}
于 2012-12-12T08:58:43.903 に答える
0

シングルトンとしてラップします。そんな感じ?

if (is_callable($this->_lazyLoad)) {
    $this->_lazyLoad = $this->_lazyLoad($this);
}

return $this->_lazyLoad;
于 2012-11-26T21:59:41.587 に答える