从 PHP 渲染 Twig 宏?
Render Twig macro from PHP?
我目前正在将一个项目从基于 XML 的旧自定义模板引擎迁移到 Twig。为了简化 t运行sition,我认为能够从旧引擎内部渲染 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);
如果缓存中不存在 twig 源,loadTemplate
将编译它。
render
方法将安全地呈现您的模板。
宏基本上是编译class的方法(参见本fiddle的编译模板link:http://twigfiddle.com/orfp3d)你可以从外部调用宏很容易,但不推荐这样做(因为您的宏不会参与 TemplateInterface
)
我目前正在将一个项目从基于 XML 的旧自定义模板引擎迁移到 Twig。为了简化 t运行sition,我认为能够从旧引擎内部渲染 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);
如果缓存中不存在 twig 源,loadTemplate
将编译它。
render
方法将安全地呈现您的模板。
宏基本上是编译class的方法(参见本fiddle的编译模板link:http://twigfiddle.com/orfp3d)你可以从外部调用宏很容易,但不推荐这样做(因为您的宏不会参与 TemplateInterface
)