我是Symfony 2.8的新手。 我有这个数组
IndexController.php on line 18:
array:6 [▼
"code" => "Home"
"parent" => "master"
"labels" => array:1 [▼
"en_US" => "Home"
]
"mainMenu" => false
"footerMenu" => false
"headerMenu" => true
]
例如:当mainMenu设置为true时,我需要显示mainMenu.html.twig。
使用此方法,我调用此数组
public function indexAction(Request $request, $locale, $page) {
$pageContent = $this->container->get("pimc_akeneo_cms_page_content_builder");
$akeneoConnector = $this->container->get("pimc_akeneo_cms_backend_connector");
$html = $pageContent->build($page, $locale);
$elements = $akeneoConnector->getCategoryList($page);
if($elements['mainMenu'] == true){
$this->render('base/mainMenu.html.twig'); // I have problem in here
}
if($elements['headerMenu'] == true){
$this->render('base/headerMenu.html.twig'); // I have problem in here
}
if($elements['footerMenu'] == true){
$this->render('base/footerMenu.html.twig'); // I have problem in here
}
return $this->render('base/index.html.twig', ["content" => $html]);
}
我在基础app / Resources / views / base /中有headerMenu.html.twig,footerMenu.html.twig和mainMenu.html.twig。 这似乎是一个简单的问题,但我无法解决它。 所以问题是当mainMenu.html.twig设置为true时要编写的语法。我该如何显示?
答案 0 :(得分:3)
首先,return $this->render()
以Symfony\Component\HttpFoundation\Response
实例的形式返回HTTP响应,这是Symfony控制器中每个*Action
方法所必需的。有那个
表示您不能为每个请求返回多个回复,而$this->render()
没有return
也不会对Symfony产生任何影响。
在您的情况下,您应该将模板逻辑显示到View图层,如下所示:
在indexAction
return $this->render('base/index.html.twig', [
"content" => $html,
"elements" => $elements // pass this to template
]);
在base/index.html.twig
{% if elements['mainMenu'] is defined and elements['mainMenu'] is same as(true) %}
{% include 'base/mainMenu.html.twig' %}
{% endif %}
{% if elements['headerMenu'] is defined and elements['headerMenu'] is same as(true) %}
{% include 'base/headerMenu.html.twig' %}
{% endif %}
etc...
或者(仅当您有多个替代模板可以在同一DOM的位置呈现时):
{% for tmpl in ['mainMenu', 'headerMenu', 'footerMenu'] %}
{% if elements[tmpl] is defined and elements[tmpl] is same as(true) %}
{% include 'base/' ~ tmpl ~ '.html.twig' %}
{% endif %}
{% endfor %}
因此,将这个逻辑放在模板中可以更好地MVC分离关注点,现在您不必在每个控制器中重复该逻辑,其中View会显示这些菜单。您只需要传递$elements
变量。