Symfony2& Doctrine - Lazy通过服务加载实体的属性

时间:2013-10-16 03:24:50

标签: php symfony doctrine-orm entity lazy-loading

我想知道是否可以制作一个自定义的Doctrine代理或类似代码,这样我就可以从服务中延迟加载Entity的属性。

实施例

class Article {
  ...
  /** @ORM\Column(type=integer) **/
  protected $userId;

  /** @var /MyUser  **/
  protected $user;
}

$ user属性不由doctrine处理。用户通过连接到Web服务的DI服务获取。我想要做的是挂钩到学说,所以当使用$article->user时,使用自定义DI服务延迟加载对象。

有任何想法是否可能?

如果无法进行延迟加载,是否可以挂钩postLoad事件并使用预定义服务加载用户对象?

1 个答案:

答案 0 :(得分:2)

我肯定会使用postLoad事件。作为第一步,您可以从Web服务中注入用户。 作为第二步,您可以轻松地在postLoad事件中注入一个代理,然后该代理负责加载实际数据延迟。

示例: 首先,您需要配置您的监听器:

services:
    my.listener:
        class: Acme\MyBundle\EventListener\UserInjecter
        arguments: ["@my_api_service"]
        tags:
            - { name: doctrine.event_listener, event: postLoad }

然后你需要实现监听器:

namespace Acme\MyBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\UserBundle\Entity\User;

class UserInjecter
{
    protected $myApiService;    

    public function __construct($myApiService){
       $this->myApiService = $myApiService;
    }

    public function postLoad(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();


 $entityManager = $args->getEntityManager();


    if ($entity instanceof User) {
        $entity->apiuser = $this->myApiService->loadUserData($entity->getIdentifier());
    }
}

}