我和一些同事正在将Sonata数据块捆绑软件与Sonata页面捆绑软件结合使用。在我们的界面中,我们可以打开一个页面,然后向其添加块。简单。
现在,我想发送包含页面标题和与页面相关的第一个文本块的电子邮件。我在控制器中使用dump($page)
来验证我是否可以访问该页面。我通过$page->getTitle()
从页面中提取标题。
但是当我尝试检索块信息时,$page->getBlocks()
方法仅返回一个包含空集合的对象。
我已经确认可以从CMS的页面中加载块,所以我知道有一种方法。
我在做什么错了?
答案 0 :(得分:1)
$blocks
实体的Page
参数是一个实现,因此默认为lazy loaded。
如果您希望在随时随地加载任何$block
实体时始终加载Page
,则可以eager load块,但是由于对性能的影响,不建议这样做(您可能不会这样做)每次加载$blocks
实体时都不需要Page
。
如果加载了$blocks
,则另一种方法是手动初始化集合,如下所示:
$blocks = $page->getBlocks();
$blocks->initialize();
然后,当您dump($blocks)
时,它们不应为空集合。
通常,惰性抓取的集合在使用时即被初始化。在foreach中-这就是它起作用的原因。
答案 1 :(得分:0)
这并不是一个令人满意的答案,但是我发现通过在$page->getBlocks()
循环中遍历foreach
的结果(而不是仅仅使用dump($page)
来查看输出) ,我突然能够访问块的内容!快点!魔法!
foreach ($page->getBlocks() as $block) {
$blocks[] = $block;
}
如果有人想给出更深入的答案,以解释应用程序为何以这种相当神秘的方式运行,我很乐意将其标记为正确的答案。