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


Symfony2 & Doctrine - Lazy load an entity's property through a service

我想知道是否可以制作一个自定义的 Doctrine 代理或类似代理,允许我从服务延迟加载实体的属性。

例:

class Article {
  ...
  /** @ORM'Column(type=integer) **/
  protected $userId;
  /** @var /MyUser  **/
  protected $user;
}

$user财产不是由原则处理的。用户通过连接到 Web 服务的 DI 服务获取。我想做的是钩入原则,以便在使用$article->user时,使用自定义的 DI 服务延迟加载对象。

知道这是否可能吗?

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

我肯定会使用 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());
    }
}

}