具有内省功能的PHP模板引擎

具有内省功能的PHP模板引擎,php,twig,smarty,php-7,template-engine,Php,Twig,Smarty,Php 7,Template Engine,我想根据模板的变量为输入定义表单字段 因此,我发现模板引擎需要类似内省的东西,以便能够检索模板的变量 Smarty只是提供了一个指定变量的列表,据我所知,Twig只是处于调试模式。 除了编写自己的引擎,你知道我如何解决这个问题吗 提前谢谢 编辑以澄清:如果有类似于{{foo}的内容,我想从模板中获取一个带有变量名的字符串。这可能吗?在twig中有一个特殊变量\u context。这是一个包含模板内所有已知变量的变量。您可以通过循环变量来检查它包含哪些变量,例如 {% for key in _co

我想根据模板的变量为输入定义表单字段

因此,我发现模板引擎需要类似内省的东西,以便能够检索模板的变量

Smarty只是提供了一个指定变量的列表,据我所知,Twig只是处于调试模式。 除了编写自己的引擎,你知道我如何解决这个问题吗

提前谢谢


编辑以澄清:如果有类似于
{{foo}
的内容,我想从模板中获取一个带有变量名的字符串。这可能吗?

twig
中有一个特殊变量
\u context
。这是一个包含模板内所有已知变量的变量。您可以通过循环变量来检查它包含哪些变量,例如

{% for key in _context|keys %}
    {{ key }}<br />
{% endfor %}

宏是一个例外,因为它们在
twig
中有自己的(变量)作用域。这意味着它们不共享全局
\u上下文
变量,而是拥有自己的变量。如果要从宏外部访问变量,只需将
\u上下文
传递给宏,例如

{% import _self as 'macros' %}

{% macro foo(context) %}
   {{ _context | keys | length }} {# 0 #}
   {{ context.my_fixed_var_bar }} {# foobar #}
{% endmacro %}

{{ macros.foo() }} {# 0 foobar #}

如果需要访问函数/筛选器/扩展类中的变量
\u context
,可以通过将选项
needs\u context
设置为
true

$twig->addFunction(new \Twig\TwigFunction('my_function', function($context) {
     //do stuff
}, [ 'needs_context' => true, ]));


不要将它们作为单个变量传递,而是将它们作为数组中的元素传递,然后在数组中迭代。@DarkBee:如果你将其作为答案发布,这将是正确的答案。我不明白-你说的“内省”是什么意思?为什么模板引擎应该关心单个表单字段的值呢?感谢您的长时间回复。不幸的是,我目前无法在twig模板中获取变量名。为了澄清:如果存在类似
{{foo}}
的情况,我想从模板中获取一个带有变量名的字符串。这可能吗?您可以检查
\u context
{%if'foo'在{u context}keys%}foo存在{%endif%}
,但我不知道密钥名称。那么您想要实现什么?
$twig->addFunction(new \Twig\TwigFunction('my_function', function($context) {
     //do stuff
}, [ 'needs_context' => true, ]));