【问题标题】:Symfony Cache Component and Lazy LoadingSymfony 缓存组件和延迟加载
【发布时间】:2017-07-11 23:01:22
【问题描述】:

我正在为 Symfony 3.2 使用缓存组件。 我有一个名为 MenuItem 的实体,它与其他实体具有多对一关系:

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;

问题是,当我从缓存中获取数组时,我的 MenuItems 中的实体 ProductCategory 是代理,如您所见:

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

如果我调用getName(),它会返回“”而不是产品类别名称(延迟加载不起作用)。

我不明白这种行为,所以如果有人能解释我会很高兴,因为延迟加载不起作用(我想我可以配置与fetch="EAGER" 的关系以避免这个问题)。

谢谢。

【问题讨论】:

    标签: symfony caching doctrine lazy-loading


    【解决方案1】:

    这是“实体不受管理”的常见副作用,发生这种情况是因为您的缓存实体在从缓存中检索所有菜单项 ($menuItems = $menuItemsCached->get()) 后超出实体管理器的范围,因此相关代理是 "死了”

    您只需将每个缓存的实体合并到当前的实体管理器,代理就会再次“存活”

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

    以后,你就可以偷懒的获取每个产品类别的名称了。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多