簡體   English   中英

Silex微框架和Twig:啟用調試

[英]Silex micro-framework and Twig: enable debug

我的問題:如何允許在Silex中的Twig模板中使用debug


我正在玩Silex微框架(一個利用Symfony的PHP框架)。

當使用Twig模板系統時,我想輸出一個特定的對象。 通常我會用var_dump($app);執行此操作var_dump($app); 並在Twig中使用{% debug app %}

我的問題是調試(並將Silex自己的調試設置為true對Twig沒有幫助)與Silex一起工作。 開箱到呼叫debug將導致一個錯誤信息:

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

調試調用如下所示:

{% 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),
));

不行。 這是錯誤的選擇嗎? 只是格式不正確? 我不知道,我沒有嘗試過任何作品。

我感覺自己進入了“輪子旋轉”模式,所以我在這里問這個問題,希望我能在今天早上繼續進行更有成效的工作。 :)

(呃......對於超特定的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());
});

說實話,我覺得這對我來說足夠了Silex。

這個解決方案歸功於Nerdpress。


*忍者編輯:一年半之后,我不得不說Silex對我來說是個蠢貨。 我一直在使用Slim來滿足所有微框架需求,這太棒了。 快速,干凈,簡單,輕松地完成工作。

我完全刪除了舊答案,以顯示我構建的一個小示例應用程序的輸出:

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();

現在已經有一段時間了,所以我對接受的答案做了一個小的更新,你可以使用新的擴展方法的疙瘩:

composer.json:

"silex/silex": "~1.3",
"twig/twig": "^1.23",
"symfony/twig-bridge": "^2.7",
"twig/extensions": "^1.3"

index.php(前端控制器)

/*
* config
*/
//...
$app->register(new Silex\Provider\TwigServiceProvider(), array(
        'twig.path' => __DIR__.'/../templets',
        'twig.options' => array('debug' => true),
    )
);
$app['twig'] = $app->share($app->extend('twig', function($twig, $app) {
    $twig->addExtension(new Twig_Extension_Debug());
    return $twig;
}));
//...


/*
* some static page
*/
$app->get('/', function () use($app) {
    return $app['twig']->render('index.twig');
});

$app->run();

對於silex ^ 2.2使用疙瘩3,share()已被刪除,因此使用:

$app->extend('twig', function($twig, $app) {
    $twig->addExtension(new Twig_Extension_Debug());
    return $twig;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM