Laravel setEscapedContentTags和setContentTags有什么区别?

时间:2015-05-18 09:53:57

标签: php templates laravel-5

为了更好地理解Laravel标记设置的工作原理,我尝试了以下方法:

Blade::setContentTags('<x', 'x>');
Blade::setEscapedContentTags('<y', 'y>');
Blade::setRawTags('<z', 'z>');

在我的控制器构造函数中。

在Blade视图中,我添加了

<div>
  <x 'test' x>
  <y 'test' y>
  <z 'test' z>
</div>

我清理了storage / framework / views文件夹并重新加载了页面。

结果,在编译视图中我得到了

<div>
    <?php echo e('test'); ?>

    <?php echo e('test'); ?>

    <?php echo 'test'; ?>

</div>  

如您所见,为使用setContentTags和setEscapedContentTags指定的标记编译的代码看起来相同。为什么我们需要这两个选项?

1 个答案:

答案 0 :(得分:2)

这是一种安全理由。 默认情况下,Blade将为包含常规和转义标记的内容返回相同的结果。 BladeCompiler类已保护属性$echoFormat,其值为e(%s)。当内容使用常规标记(在您的情况下是&#39; x&#39;)进行编译时,将使用此属性。

/**
 * The "regular" / legacy echo string format.
 *
 * @var string
 */
protected $echoFormat = 'e(%s)';

该属性用作函数e

的占位符
/**
 * Escape HTML entities in a string.
 *
 * @param  string  $value
 * @return string
 */
function e($value)
{
    return htmlentities($value, ENT_QUOTES, 'UTF-8', false);
}

当内容使用转义标记进行编译时,也会调用e函数(在您的情况下,它是&#39; y&#39;)

您也可以更改格式:

/**
 * Set the echo format to be used by the compiler.
 *
 * @param  string  $format
 * @return void
 */
public function setEchoFormat($format)
{
    $this->echoFormat = $format;
}

如果您的文字前面带有Blade符号,则使用默认设置regular会为包含escaped tags@的内容返回不同的结果。

对于查看参数

['str' => "<script>alert('name')</script>"]

使用模板

<div>@{{ $str }}</div>
<div>@{{{ $str }}}</div>

<div>@{{"<a>Plain text</a>"}}</div>
<div>@{{{"<a>Plain text</a>"}}}</div>

结果将是

<div>{{ $str }}</div>
<div>@&lt;script&gt;alert(&#039;name&#039;)&lt;/script&gt;</div>

<div>{{"<a>Plain text</a>"}}</div>
<div>@&lt;a&gt;Plain text&lt;/a&gt;</div>