3

我使用作为服务加载的 Redis 将追随者注入实体。所以我有一个像 User 这样的实体,它有一个像 getFollowers 这样的方法。我不想将服务与实体混合,所以我制作了一个订阅 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 回答