Php Symfony2&;条令-延迟加载实体';通过一项服务获取用户的财产

Php Symfony2&;条令-延迟加载实体';通过一项服务获取用户的财产,php,symfony,doctrine-orm,entity,lazy-loading,Php,Symfony,Doctrine Orm,Entity,Lazy Loading,我想知道是否有可能创建一个自定义的原则代理或类似的代理,允许我从服务中延迟加载实体的属性 例如: class Article { ... /** @ORM\Column(type=integer) **/ protected $userId; /** @var /MyUser **/ protected $user; } $user属性不由条令处理。通过连接到web服务的DI服务获取用户。我想做的是挂接到条令中,以便在使用$article->user时,使用自定义的DI

我想知道是否有可能创建一个自定义的原则代理或类似的代理,允许我从服务中延迟加载实体的属性

例如:

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());
    }
}
然后您需要实现侦听器:

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

}

我查阅了文档,但不确定如何真正做到这一点。请举一个简单的例子。谢谢,谢谢。我想我可以使用您提供的内容,另外编写一个lazyLoader类,该类实例将被分配给“postLoad”上的属性,并且在“\uu call”中,它将检测方法调用,加载对象,用对象替换lazyLoader实例,并执行请求的方法。