Symfony2の本番環境のTwig内で変数の中身を綺麗に表示(pretty print)したい


Why

結論

  • 設定次第では本番環境でもdumpを有効にできるが、デバッグ目的の趣が強いのであまりおすすめできない気がする
  • 代わりにjson_encodeJSON_PRETTY_PRINTJSON_UNESCAPED_UNICODEオプション付きで使えばわりと綺麗に表示できる
  • bootstrap3を使うなら下記のイメージ
<pre><code>
    {{- var|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) -}}
</code></pre>

検証その1

  • 下記のようなコントローラーとテンプレートを用意し、開発環境と本番環境での表示を確認する
  • Symfony2のバージョンは
$ ./app/console --version
Symfony version 2.7.7 - app/dev/debug

コントローラー

<?php
// (namespace など省略)
class PrettyPrintController extends Controller
{
    /**
     * @Route("/")
     * @Template
     */
    public function indexAction()
    {
        return [
            'var' => [
                0,
                '1',
                true,
                null,
                [
                    'key' => 'value',
                ],
            ],
        ];
    }
}

テンプレート(Twig)

{% extends 'base.html.twig' %}

{% block stylesheets %}
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
{% endblock %}

{% block body %}
  <div class="container">
    <h2>dump</h2>
    <div>
      {{ dump(var) }}
    </div>

    <h2>json_encode</h2>
    <pre><code>
    {{- var|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_UNESCAPED_UNICODE')) -}}
    </code></pre>
  </div>
{% endblock %}

開発環境(environment: dev)での表示

  • dumpでは綺麗な表示に加えて、JavaScriptを使った変数の中身の開閉処理機能がある
  • json_encodeでも綺麗に表示できている

本番環境(environment: prod)での表示

  • 下記のようなエラーが出て表示できない
[2015-12-19 16:36:19] request.CRITICAL: Uncaught PHP Exception Twig_Error_Syntax: "Unknown "dump" function in ...

検証その2

  • 本番環境でもdumpできるように設定を変えて、本番環境での表示を確認する

app/config/config.yml

  • twig.debug の値を kernel.debug の値に影響されず、常にtrueを返すようにする
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -33,7 +33,7 @@ framework:

 # Twig Configuration
 twig:
-    debug:            "%kernel.debug%"
+    debug:            true
     strict_variables: "%kernel.debug%"

 # Assetic Configuration

app/config/services.yml

  • twig.extension タグを付けた Twig_Extension_Debug のサービスを追加する
--- a/app/config/services.yml
+++ b/app/config/services.yml
@@ -7,3 +7,7 @@ services:
 #    service_name:
 #        class: AppBundle\Directory\ClassName
 #        arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
+    my.twig.extension.debug:
+        class: Twig_Extension_Debug
+        tags:
+            - { name: 'twig.extension' }

本番環境(environment: prod)での表示

  • 本番環境でも dump が表示された
  • しかし、上述した開発環境で表示された形式になっていない
    • JavaScriptを使った変数の中身の開閉処理機能がない
  • この理由はTwigのdump関数で処理されているコードが別だから

参考