{{}}
ですべてエスケープされるのは5から
久々にBladeテンプレートを見直して、構文などを忘れたので公式で確認してました。
注意: Bladeの{{ }}文は自動的にPHPのhtmlentities関数を通し、XSS攻撃を防ぎます。
流石にテンプレート構文の書き方はそうそう変わらないだろうと5のマニュアルを読んでいて、そう言えばコードに
// e()はhtmlentities()のラッパー
{{ e('あぶないchara') }}
という記述が散見されていたのを思い出し、そうか(安全側に倒しているけど)無駄だったかと外していったら
{{ 'またまたあぶないchara' }}
見事に表示が崩れた。
慌てて調べたら、実装はこうなっていた。
class Blade {
/**
* Rewrites Blade echo statements into PHP echo statements.
*
* @param string $value
* @return string
*/
protected static function compile_echos($value)
{
$value = preg_replace('/\{\{\{(.+?)\}\}\}/', '<?php echo HTML::entities($1); ?>', $value);
return preg_replace('/\{\{(.+?)\}\}/', '<?php echo $1; ?>', $value);
}
}
ぱっと見、正規表現が見づらいので、ちゃんとエスケープしているなと思ったが、2回置換している不自然さによく見ると2重と3重で処理が分かれていた。
webでも調べなおして5から変わったとのこと。
Laravel5(Blade)のViewで改行させたいだけなのに少し悩んだ - Qiita
(便利そうなの増えてる…)
直接は関係ないが、5ではe()
にも変更が入った
Laravel の Blade で {{ と }} に囲まれたものは全てエスケープされるわけじゃない - 頭ん中
ちゃんと今使っているバージョンのドキュメントを、(探すのも非常に辛いですが)探しましょうという真っ当な結論です。
PHPStormではBladeテンプレート対応
{{e()}}
と{{{}}}
では文字数にして1文字の削減。
せっかくある機能を使わないのもなんですし、三重に置き換えようとしました。
そうですよね。サポートするなら5の記法ですよね。
が、一応設定画面でold versionの対応してくれていないか見てみました。
ありました。
ネットにもありました。
Laravel 4 Blade markup and Ide Helper in PhpStorm - Stack Overflow
私のバージョンが古いのか、Content tagsとEscaped tagsの記述が逆ですね…
Stack Overflowの組み合わせが正しい気がしますが、自信がない…。
Raw Tagsは不明。
バージョンよる違いがあるかもしれませんので、ひとまず既存の設定の場所のまま古い記法に書き換えます。
エラーも解消されました。