Laravel4までのBladeでエスケープしつつデータ表示は波括弧三重{{{}}}。PhpStormには設定書き換えが必要


{{}}ですべてエスケープされるのは5から

久々にBladeテンプレートを見直して、構文などを忘れたので公式で確認してました。

Bladeテンプレート 5.1 Laravel

注意: 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

Laravelのbladeってやつをまとめてみた

(便利そうなの増えてる…)


直接は関係ないが、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は不明。

バージョンよる違いがあるかもしれませんので、ひとまず既存の設定の場所のまま古い記法に書き換えます。

エラーも解消されました。