1

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

例子:

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

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

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

知道这是否可能吗?

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

4

1 回答 1

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());
    }
}

}

于 2013-10-16T11:38:09.120 回答