如何自定义渲染Symfony

时间:2017-10-24 11:15:00

标签: php symfony symfony-2.8

我是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时要编写的语法。我该如何显示?

1 个答案:

答案 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变量。