我有此控制器操作:
public function index(Request $request)
{
$start = $request->get('start', 0);
$limit = $request->get('limit', 10);
$articles = $this->articleRepository->all($start, $limit);
$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());
return $this->render('article/index.html.twig', [
'articles' => $articles,
'navigation'=>$navigation
]);
}
我使用以下菜单构建菜单
:$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());
现在这是高级行为,我不想为其中的每个动作都渲染它。在Symfony中,有没有一种方法可以将此行为移至某种视图编写器(例如Laravel中),然后与视图共享该变量?
还是没有办法,我需要创建基本控制器吗?
答案 0 :(得分:1)
您可以按照以下说明创建自定义树枝扩展名:https://symfony.com/doc/current/templating/twig_extension.html
您可以在其中注册一个自定义的Twig函数,如下所示:
var addedItems = [];
var item = {};
item["TId"] = "";
item["VNo"] = "";
item["IDate"] = "";
item["Rate"] = 22;
item["ItemId"] = 12;
item["Quantity"] = 1;
item["ItemTypeId"] = 3;
addedItems.push(item);
removeValueFromObjectByValue(addedItems,12);
function removeValueFromObjectByValue(jsonObject, value) {
jQuery.each(jsonObject, function (i, val) {
if (val.ItemId == value) // delete index
{
return;
delete jsonObject[i];
return;
}
});
}
然后,您可以在每个模板中使用该功能,例如public function getFunctions()
{
return array('renderNavigation' => new TwigFunction(
'renderNavigation',
array($this, 'renderNavigation'),
array('needs_environment' => true, 'is_safe' => array('html'))
);
}
public function renderNavigation(Environment $twig)
{
/* ... */
return $twig->render(/* ... */);
}
由于Twig Extension本身是一项服务,因此您可以注入其他所需的任何服务(例如RequestStack,EntityManager等),如果您需要运行多个功能,甚至可以在扩展中缓存昂贵的操作。