9

debug私の質問: Silex 内の Twig テンプレートでの使用を許可するにはどうすればよいですか?


Silex マイクロ フレームワーク (Symfony を活用する PHP フレームワーク) をいじっています。

Twig テンプレート システムを使用するときに、特定のオブジェクトを出力したいと考えていました。通常、私はこれをvar_dump($app);と Twig で行い{% debug app %}ます。

私の問題は、Silex で動作するようにデバッグを取得することです (そして、Silex 独自のデバッグをtrueTwig では役に立ちません)。すぐに を呼び出すとdebug、エラー メッセージが表示されます。

Twig_Error_Syntax: Unknown tag name "debug" in...

debug の呼び出しは次のようになります。

{% debug app %}

Twig の config.yml ファイルを正しく使用するように構成する方法への参照を見つけましdebugたが、Silex は Twig の構成ファイルを使用しません。

Silexは、連想配列を渡すことでオプションを設定できると言っていますがtwig.options、Twigのドキュメントでは、次のような環境オプションを渡すことができると言われています。

$twig = new Twig_Environment($loader, array('debug' => true));

次のようにSilexで渡そうとしています:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.options' => array('debug' => true),
));

動作しません。これは間違った種類のオプションですか?単純にフォーマットが間違っていますか?私は何も知りませんし、私が試したことは何もありません。

私は自分が「ホイールスピン」モードになっているのを感じているので、今朝より生産的な仕事に移れることを願って、ここで SO に質問しています. :)

(うーん...超具体的なStackOverflowの質問はどうですか?)


解決策:(これはすべてvar_dump機能のようにするためのものです... ああ、私):正直言って、これは少し面倒でした.Silexのドキュメントはこれを発見するのにまったく役に立ちませんでしたが、ここに私が持っていたものがありますこれを機能させるために行うこと。

最初に Twig オートローダーをロードします。

$app['autoloader']->registerPrefixes(array(
    'Twig_Extensions_'  => array(__DIR__.'/vendor/Twig-extensions/lib')));

なぜこのように登録する必要があるのですか?わかりません。実際にオートローダーを見つける方法は? わかりません。しかし、それは機能します。

プロバイダーを登録し、デバッグ オプションを設定します。

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path'         => __DIR__.'/views',
    'twig.class_path'   => __DIR__.'/vendor/Twig/lib',
    'twig.options'      => array('debug' => true), //<-- this is the key line to getting debug added to the options
));

そして最後に(最良の部分):

$oldTwigConfiguration = isset($app['twig.configure']) ? $app['twig.configure']: function(){};
$app['twig.configure'] = $app->protect(function($twig) use ($oldTwigConfiguration) {
    $oldTwigConfiguration($twig);
    $twig->addExtension(new Twig_Extensions_Extension_Debug());
});

正直なところ、私はそれで十分だと思います。

このソリューションの功績はNerdpress にあります。


*忍者編集:1年半後、Silexは私にとって不発弾だったと言わざるを得ません. 私はすべてのマイクロフレームワークのニーズにSlimを使用してきましたが、それは素晴らしいものです。仕事を素早く、きれいに、簡単に、そして簡単にこなします。

4

3 に答える 3

10

私が構築した小さなサンプルアプリからの出力を表示するために、古い回答を完全に削除しました。

composer.json:

{
  "require": {
    "silex/silex": "1.*",
    "twig/twig": "1.*",
    "twig/extensions": "*"
  }
}

app.php:

require_once __DIR__ . '/../vendor/.composer/autoload.php';

$app = new Silex\Application();

$app['debug'] = true;

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__ . '/views',
    'twig.options' => array('debug' => true)
));
$app['twig']->addExtension(new Twig_Extensions_Extension_Debug());

$app->get('/', function () use ($app) {
    return $app['twig']->render('debug_test.twig', array('app' => $app));
});
$app->run();
于 2012-02-08T15:33:23.800 に答える