提问者:小点点

从Sonata中的页面获取块内容


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

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

但是当我试图检索块信息时,$页面-

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

我做错了什么?


共2个答案

匿名用户

页面实体的$blocks参数是一个实现,因此默认情况下是延迟加载的。

如果您想在任何地方加载任何页面实体时始终加载$block,则可以立即加载块,但由于性能影响,不建议这样做(您可能不需要每次加载页面实体时都加载$blocks)。

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

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

然后,当您转储($blocks)时,它们不应该是空集合。

一般来说,懒惰获取的集合在使用它们的那一刻就被初始化了,例如在Foreach中——这就是它工作的原因。

匿名用户

这并不是一个令人满意的答案,但我通过迭代$page的结果发现-

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

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