В настоящее время я перевожу проект из старого пользовательского шаблонизатора на основе XML в прут. Чтобы облегчить переход, я подумал, что было бы неплохо иметь возможность рендерить макросы Twig из старого движка, чтобы новые виджеты можно было создавать с помощью Twig и запускать в обоих местах по мере необходимости.
Единственный способ сделать это — сгенерировать исходный код Twig, который выглядит следующим образом:
{% import 'macros.twig' as m %}
{{ m.widget(...) }}
А потом сделать что-то сумасшедшее, как
eval('?>'.$twig->compileSource($twig->getLoader()->getSource($name), $name));
Который кажется медленным, опасным и ломким. Есть ли лучший способ подключиться к Twig API?
Да, для рендеринга шаблона вы должны использовать:
echo $twig->loadTemplate($name)->render($context);
loadTemplate
скомпилирует источник ветки, если он не существует в кеше.
render
Метод сделает ваш шаблон безопасно.
Макрос — это в основном метод скомпилированного класса (см. Ссылку на скомпилированный шаблон этой скрипты: http://twigfiddle.com/orfp3d) вы можете вызывать макрос извне довольно легко, но это не рекомендуется (так как ваш макрос не будет принимать участие в TemplateInterface
)
Других решений пока нет …