带有三元运算符的原始过滤器,用于html类属性

时间:2015-12-13 23:00:38

标签: html css attributes twig

我一直试图弄清楚如何阻止Twig逃脱以下代码,我觉得这对于简洁的三元运算符来说更好一点。

希望有人可以确认我使用了正确的语法,如果在我的_layout.twig文件中有任何性能点击,请执行此操作:

<body{{ bodyClass is defined ? (' class="' ~ bodyClass ~ '"')|raw : '' }}>

并包含在我的_template.twig文件中:

{% extends "_layout" %}

{% set bodyClass   = 'Home' %}

似乎工作,是我到目前为止获得适当输出的唯一方法!

1 个答案:

答案 0 :(得分:2)

我对语法和性能看起来不错。

此代码在Twig 1.23.1中编译为:

 echo "<body";
 echo ((array_key_exists("bodyClass", $context)) ?
     (((" class=\"" . (isset($context["bodyClass"]) ? 
        $context["bodyClass"] : null)) . "\"")) : (""));
 echo ">";

如您所见,

  • 没有异国情调的代码,没有什么会减慢您的代码
  • 没有绕过任何已编译的代码,因此您的结果将是原始的

但这是一场安全噩梦,如果bodyClass包含任意代码,则可以向dom for example, this注入任何内容。

顺便说一句,我借此机会提醒class="{{ bodyClass }}"使用默认转义策略不够安全,使用{{ bodyClass | e('html_attr') }}更安全。