2017-07-11 15 views
1

私はSymfony 3.2のキャッシュコンポーネントを使用しています。 I他との一対一の関係に多くを持っているエンティティの名前のMenuItemがあります。サービスでsymfonyキャッシュコンポーネントとレイジーロード

class MenuItem 
{ 
    //... 

    /** 
    * @ORM\ManyToOne(targetEntity="BaseBundle\Entity\ProductCategory") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

    //... 

を、私はすべてのメニューアイテムを取得し、キャッシュに保存したい:

$menuItemsCached = $this->cache->getItem('app.menu_items'); 
    if ($menuItemsCached->isHit()) { 
     $menuItems = $menuItemsCached->get(); 
    } else { 
     $repository = $this->em->getRepository('WebBundle:MenuItem'); 
     $menuItems = $repository->findBy([], ['weight' => 'ASC']); 
     $menuItemsCached->set($menuItems); 
     $this->cache->save($menuItemsCached); 
    } 
    return $menuItems; 

問題は、私はキャッシュから配列を取得するとき、あなたが見ることができるように、私のMenuItemの内部実体ProductCategoryはプロキシされている、ということである:

5 => MenuItem {#3428 ▼ 
    #id: 3 
    #name: "Vinils" 
    #weight: 60 
    #selector: "vinil" 
    -categoryCollection: ProductCategory {#3429 ▼ 
     +__isInitialized__: false 
     #id: 23 
     #name: "" 

そして、私はと呼ばれる場合製品カテゴリ名の代わりに ""が返されます(遅延読み込みは機能しません)。

遅延読み込みが機能しないため誰でも私のことを説明できればとてもうれしいです(この問題を避けるためにfetch="EAGER"との関係を設定できると思います)。

ありがとうございました。

答えて

2

それはあなたのキャッシュされたエンティティが直後エンティティマネージャからのスコープ外であるため、この現象が発生、「管理されていないエンティティ」の一般的な副作用のキャッシュ($menuItems = $menuItemsCached->get())からすべてのメニュー項目を取得し、したがって、関連するプロキシはある「死んだ」

必要なのは、現在のエンティティ・マネージャにキャッシュされた各エンティティをマージし、プロキシが再びを「生きる」になります。

$menuItems = $menuItemsCached->get(); 
foreach ($menuItems as &$menuItem) { 
    $menuItem = $entityManager->merge($menuItem); 
} 

その後、あなたは、各製品カテゴリの名前を取得することができるだろう怠け者。

関連する問題