【问题标题】:PHP template engine with introspection [closed]具有自省功能的 PHP 模板引擎 [关闭]
【发布时间】:2020-03-04 11:08:09
【问题描述】:

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

因此,我发现模板引擎需要像自省这样的东西,以便我能够检索模板的变量。

Smarty 仅提供分配变量的列表,据我所知,Twig 仅处于调试模式。 除了编写自己的引擎之外,你知道我还能如何解决这个问题吗?

提前致谢

编辑澄清:如果有像{{ foo }} 这样的东西,我想从模板中获取一个带有变量名的字符串。这可能吗?

【问题讨论】:

  • 不要将它们作为单独的变量传递,将它们作为数组中的元素传递,然后遍历数组。
  • @DarkBee:如果您将此作为答案发布,这将是正确答案。
  • 我不明白 - 你所说的“内省”是什么意思?为什么模板引擎应该关心单个表单字段值?

标签: php twig smarty php-7 template-engine


【解决方案1】:

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

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

您也可以使用此变量来访问动态变量,例如

{% set my_fixed_var_bar = 'foobar' %}
{% set foo = 'bar' %}

{{ _context['my_fixed_var_'~bar]| default('N/A') }} {# with array notation #}
{{ attribute(_context, 'my_fixed_var_'~foo) | default('N/A') }} {# with attribute function #}

宏是一个例外,因为它们在twig 中有自己的(可变)范围。这意味着他们不共享全局 _context 变量,而是拥有自己的变量。如果您想从宏外部访问变量,您只需将 _context 传递给宏,例如

{% import _self as 'macros' %}

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

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

如果您需要在函数/过滤器/扩展类中访问变量_context,您可以通过将选项needs_context 设置为true 来实现此目的

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

demo

【讨论】:

  • 感谢您的长篇回复。不幸的是,我目前无法在 twig 模板中获取变量名。
  • 澄清一下:如果有像{{ foo }} 这样的东西,我想从模板中获取一个带有变量名的字符串。这可能吗?
  • 您可以查看_context的密钥:{% if 'foo' in _context | keys %}Foo exists{% endif %}
  • 但我不知道键名。
  • 那你想达到什么精确度呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2011-08-18
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多