从 Sonata 中的页面获取块内容

Get Block contents from a Page in Sonata

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

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

从页面中提取标题

但是当我尝试检索块信息时,$page->getBlocks() 方法只是 returns 一个包含空 collection 的 object。

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

我做错了什么?

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

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

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

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

如果你想在任何地方加载任何 Page 实体时总是加载 $block,你可以 eager load 块,但是由于性能影响不推荐这样做(你可能不需要 $blocks 每次加载 Page 实体)。

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

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

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

一般来说,延迟获取的集合会在使用时初始化,例如在 foreach 中 - 这就是它起作用的原因。