Микро-фреймворк Silex и Twig: включить отладку - PullRequest
9 голосов
/ 08 февраля 2012

Мой вопрос: как разрешить использование debug в шаблонах Twig в Silex?


Я играю с микро-фреймворком Silex (PHP-фреймворк, использующий Symfony).

При использовании системы шаблонов Twig я хотел выводить конкретный объект. Обычно я делаю это с var_dump($app); и в Twig с {% debug app %}.

Моя проблема заключается в получении отладки (и установка собственной отладки Silex на true не помогает с Twig) для работы с Silex. Из коробки вызов debug приведет к сообщению об ошибке:

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

Вызов для отладки выглядит следующим образом:

{% debug app %}

Я нашел ссылки на то, как настроить файл config.yml Twig для правильного использования 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 для всех нужд микро-фреймворка, и это фантастика. Выполняет работу быстро, чисто, просто и легко.

Ответы [ 3 ]

10 голосов
/ 08 февраля 2012

Я полностью удалил старый ответ, чтобы показать вывод из небольшого примера приложения, которое я построил:

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();
0 голосов
/ 01 марта 2018

для Silex ^ 2.2 с использованием прыща 3 функция share () удалена, поэтому используйте:

$app->extend('twig', function($twig, $app) {
    $twig->addExtension(new Twig_Extension_Debug());
    return $twig;
});
0 голосов
/ 13 ноября 2015

Прошло довольно много времени, поэтому я сделал небольшое обновление принятого ответа, вы можете использовать новый метод расширения Pimple:

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