我正在尝试使用Sonata捆绑软件中的模块为我的用户开发个人资料。由于我不知道它是如何工作的,因此我尝试通过以下操作从SonataBundle渲染一个块:
{{ sonata_block_render({ 'type': 'sonata.user.block.menu' }, {
'template': 'SonataBlock/Block/block_core_rss.html.twig',
}) }}
在我的show.html.twig中。我按照Sonata文档中的教程将其定义为service.yaml中的服务:
sonata.user.block.menu:
class: App\Block\UserProfileMenu
arguments:
- ~
- '@twig'
tags:
- { name: sonata.block }
但是当我尝试进入/ profile时,出现错误:
An exception has been thrown during the rendering of a template ("Warning: count(): Parameter must be an array or an object that implements Countable").
它似乎来自sonata_block_render,因为如果删除它,我的模板将起作用。 它来自SonataBundle BlockHelper.php:
protected function computeAssets(BlockContextInterface $blockContext, array &$stats = null)
{
if ($blockContext->getBlock()->hasParent()) {
return;
}
$service = $this->blockServiceManager->get($blockContext->getBlock());
$assets = [
'js' => $service->getJavascripts('all'),
'css' => $service->getStylesheets('all'),
];
if (\count($assets['js']) > 0) {
@trigger_error(
'Defining javascripts assets inside a block is deprecated since 3.3.0 and will be removed in 4.0',
E_USER_DEPRECATED
);
}
if (\count($assets['css']) > 0) {
@trigger_error(
'Defining css assets inside a block is deprecated since 3.2.0 and will be removed in 4.0',
E_USER_DEPRECATED
);
}
if ($blockContext->getBlock()->hasChildren()) {
$iterator = new \RecursiveIteratorIterator(new RecursiveBlockIterator($blockContext->getBlock()->getChildren()));
foreach ($iterator as $block) {
$assets = [
'js' => array_merge($this->blockServiceManager->get($block)->getJavascripts('all'), $assets['js']),
'css' => array_merge($this->blockServiceManager->get($block)->getStylesheets('all'), $assets['css']),
];
}
}
if ($this->stopwatch) {
$stats['assets'] = $assets;
}
$this->assets = [
'js' => array_unique(array_merge($assets['js'], $this->assets['js'])),
'css' => array_unique(array_merge($assets['css'], $this->assets['css'])),
];
}
但是我不明白为什么会出现此错误?有谁知道吗由于我们无法修改供应商的文件,因此我不知道如何绕过:/ 谢谢!
PS:我还有一个问题,如果我想将自己的模板做为块,是否应该将它们放在文件夹“模板”或“资源/视图/块”中?