我想知道是否可以制作一个自定义的Doctrine代理或类似代码,这样我就可以从服务中延迟加载Entity的属性。
实施例
class Article {
...
/** @ORM\Column(type=integer) **/
protected $userId;
/** @var /MyUser **/
protected $user;
}
$ user属性不由doctrine处理。用户通过连接到Web服务的DI服务获取。我想要做的是挂钩到学说,所以当使用$article->user
时,使用自定义DI服务延迟加载对象。
有任何想法是否可能?
如果无法进行延迟加载,是否可以挂钩postLoad事件并使用预定义服务加载用户对象?
答案 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());
}
}
}