Микрофреймворк Silex и Twig: включить отладку

Мой вопрос: как разрешить использование 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),
));

Не работает. Это неправильный вариант? Просто неправильное форматирование? Я понятия не имею, и ничего из того, что я пробовал, не работает.

Я чувствую, что вхожу в режим «вращения колеса», поэтому я спрашиваю здесь, на 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.


*ninja edit: полтора года спустя я должен сказать, что Silex был для меня бесполезным. Я использую Slim для всех нужд микрофреймворка, и это просто фантастика. Выполняет работу быстро, чисто, просто и легко.


person rg88    schedule 08.02.2012    source источник


Ответы (3)


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

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

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

композитор.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();
person DevWL    schedule 13.11.2015

person    schedule
comment
$app['debug']=true уже был установлен, и ваш пример настройки отладки только для Twig, по сути, то же самое, что и у меня, но не работает. Я отредактировал свой пример, чтобы показать более полный код, но в основном это то же самое, что и у вас. - person rg88; 08.02.2012
comment
Вы правы, я никогда раньше не пользовался отладкой в ​​Twig, поэтому и не замечал. Быстрый просмотр вернул сообщение: Неизвестное имя тега отладки в ..., что заставило меня понять, что оно, вероятно, предоставляется расширением, и вуаля, быстрый поиск в Google дал вышеупомянутый результат;) - person dbrumann; 08.02.2012
comment
Хорошая находка, ваш Google Fu лучше моего. Мне пришлось изменить Twig_Extensions_Extension_Debug() на Twig_Extension_Debug(), иначе он не смог его найти, но в конце концов он все равно не работает. - person rg88; 08.02.2012
comment
Вы должны добавить twig_extensions в свой проект; когда вы используете композитор, вы можете сделать это, добавив twig/extensions к вашему требованию, в противном случае добавьте github.com/fabpot/ Twig-расширения и не забудьте добавить путь к автозагрузчику - person dbrumann; 08.02.2012
comment
Спасибо. Я нашел полное решение, но ваш совет помог указать путь. - person rg88; 09.02.2012
comment
Примечание: поставщик услуг twig уже регистрирует приложение как глобальное, вам не нужно его назначать. - person igorw; 10.03.2012