symfony 4 twig覆盖默认变量

时间:2018-06-11 18:37:47

标签: twig symfony4

我在视图中设置了一个默认变量(Twig模板)。但是当我试图在控制器内覆盖它时,它不会发生。这是我的观点,

<div class="content-wrapper">
    {% if has_header|default(true) == true %}
         <!-- Header code -->
    {% endif %}
</div>

这是我的控制器,

return $this->render('index.html.twig', [
    'has_header' => false
]);

但不幸的是,即使我添加了已添加&#39; has_header&#39;为假它仍然运行标题代码。如果有人可以提供帮助,那就太好了。

2 个答案:

答案 0 :(得分:1)

这里的问题是twig编译代码如下:

if ((((array_key_exists("has_header", $context)) ? (_twig_default_filter((isset($context["has_header"]) || array_key_exists("has_header", $context) ? $context["has_header"] : (function () { throw new Twig_Error_Runtime('Variable "has_header" does not exist.', 2, $this->source); })()), true)) : (true)) == true)) {

如您所见,您的变量向下传递函数_twig_default_filter

function _twig_default_filter($value, $default = '') {
  if (twig_test_empty($value)) {
    return $default;
  }
  return $value;
}

在源代码中进一步阅读,您可以看到问题出现在函数twig_test_empty

function twig_test_empty($value) {
  if ($value instanceof Countable) {
    return 0 == count($value);
  }
  return '' === $value || false === $value || null === $value || array() === $value;
}

TLDR Twig的过滤器default也开启false 要解决此问题,您需要将代码更改为

{% if has_header is defined and has_header %}

答案 1 :(得分:0)

不是实际的解决方案,但找到了解决方法,

TWIG

<div class="content-wrapper">
    {% if has_header|default('true') == 'true' %}
         <!-- Header code -->
    {% endif %}
</div>

控制器

return $this->render('index.html.twig', [
    'has_header' => 'false'
]);

使用字符串而不是布尔值不是正确的方法,但认为它更简单。