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