如何自定义渲染 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
变量。
我是 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
变量。