【问题标题】:从 Sonata 中的页面获取块内容
【发布时间】:2019-08-27 13:35:51
【问题描述】:

我和一些同事正在将 Sonata Block Bundle 与 Sonata Page Bundle 结合使用。在我们的界面中,我们可以打开一个页面,然后向其中添加块。简单的。

现在我想发送包含页面标题和与页面相关的第一个文本块的电子邮件。我在控制器中使用dump($page) 来验证我是否可以访问该页面。我通过$page->getTitle()从页面中提取标题。

但是当我尝试检索块信息时,$page->getBlocks() 方法只返回一个包含空集合的对象。

我已经验证我可以从 CMS 中的页面加载块,所以我知道有办法做到这一点。

我做错了什么?

【问题讨论】:

    标签: php symfony sonata


    【解决方案1】:

    Page实体的$blocks参数是一个实数,因此默认是lazy loaded

    如果您希望在任何地方加载任何Page 实体时始终加载$block,您可以使用eager load 块,但是由于性能影响,不建议这样做(您可能不需要$blocks加载 Page 实体的时间)。

    如果加载了$blocks,另一种方法是手动初始化集合,如下所示:

    $blocks = $page->getBlocks();
    $blocks->initialize();
    

    那么,当你dump($blocks) 他们不应该是一个空集合。

    一般来说,惰性获取的集合在使用它们的那一刻就被初始化,例如在 foreach 中 - 这就是它起作用的原因。

    【讨论】:

    • 感谢您的回答。当我这样做时,我得到Call to a member function initialize() on array
    • 你能提供一些上下文吗?你在哪里做这个?
    • 我在控制器中执行此操作。
    • 所以之前,正如您所写,$page->getBlocks() 转储returns an object containing an empty collection,但现在它是一个数组?您是否可能在 foreach 之后进行了初始化?控制器开头和$blocks->initialize()部分之间有代码吗?
    • 看来这就是问题所在。谢谢!
    【解决方案2】:

    这并不是一个真正令人满意的答案,但我发现通过在foreach 循环中迭代$page->getBlocks() 的结果(而不是仅仅使用dump($page) 查看输出),我突然能够访问块的内容!快!魔法!

        foreach ($page->getBlocks() as $block) {
            $blocks[] = $block;
        }
    

    如果有人想给出更深入的答案,解释为什么应用程序会以这种相当神秘的方式运行,我很乐意将其标记为正确答案。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多