我的问题:如何在Silex内的Twig模板中允许使用debug
?
我正在使用Silex微框架(一个利用Symfony的PHP框架)。
当使用Twig模板系统时,我想输出一个特定的对象。通常情况下,我会使用var_dump($app);
和使用{% debug app %}
的Twig执行此操作。
我的问题是调试(并将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 docs在发现这一点时没有任何帮助,但这是我必须做的才能让它发挥作用。
首先加载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来满足所有的微框架需求,这太棒了。快速,干净,简单,轻松地完成工作。
答案 0 :(得分: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();
答案 1 :(得分:0)
现在已经有一段时间了,所以我对接受的答案做了一个小的更新,你可以使用新的扩展方法的疙瘩:
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();
答案 2 :(得分:0)
对于silex ^ 2.2使用疙瘩3,share()已被删除,因此请使用:
$app->extend('twig', function($twig, $app) {
$twig->addExtension(new Twig_Extension_Debug());
return $twig;
});