我想知道是否可以制作一个自定义的 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());
}
}
}