如何自定义渲染 Symfony

How to customize render Symfony

我是 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 时要编写的语法。我怎样才能显示这个?

首先,return $this->render() returns HTTP 响应以 Symfony\Component\HttpFoundation\Response 实例的形式出现,这是 Symfony 控制器中每个 *Action 方法所需要的。有了那个 说你不能 return 每个请求超过一个响应并且 $this->render() 没有 return 对 Symfony 没有任何影响。

在您的情况下,您应该像这样将显示模板逻辑移动到视图层:

在你的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 关注点分离,现在您不必在每个 Controller 中重复该逻辑,其中 Views 具有要呈现的菜单。然后你只需要传递 $elements 变量。