簡體   English   中英

Symfony2和Doctrine-通過服務延遲加載實體的屬性

[英]Symfony2 & Doctrine - Lazy load an entity's property through a service

我想知道是否有可能創建自定義的教義代理或類似的代理,以使我可以從服務中延遲加載實體的屬性。

例:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM