我们正在考虑允许将自定义代码嵌入到 PHP 应用程序中,并探索安全/沙盒的方法来实现这一点(例如,如果您在 Salesforce 中使用过
Apex
,或者熟悉 ExpressionLanguage
中的
Symfony
),那种事)。
我们正在探索的一件事是允许自定义
Twig
运行,但 Twig 的一个缺点是它实际上是作为一种模板语言设计的,因此由于所有额外的括号,这样的逻辑有点笨拙:
{% if foo.bar == 'test' %}
{% for line in lines %}
{% if line.rate > 10 %}
... more code here ...
{% endif %}
{% endfor %}
{% endif %}
如果我们可以写成:
,那就更干净/容易了if foo.bar == 'test'
{
for line in lines {
if line.rate > 10
{
... more code here ...
}
}
}
是否有可能/有人见过 Twig 扩展为支持多行代码,而不需要所有的
{%
和 %}
?
或者失败了......有没有人见过在 PHP 应用程序中安全嵌入逻辑的任何其他选项?我们还把 PHP
Lua
扩展视为一个潜在的选择,但我不确定它的维护情况如何......
如果没有看到特定的模板,很难说,但可以说,Twig 模板不应该有逻辑——这就是 MVC 设计的要点。如果您的模板如此复杂,那么您可能应该考虑将一些代码移动到控制器中,而不是寻找一个视图层工具来支持执行不应该在视图层中执行的操作。
我认为您的情况的解决方案就是使用较小的模板。例如,如果模板在两个不同状态之间内部切换:
{% if foo.bar == 'test' %}
... some large chunk
{% else %}
... some other large chunk
{% endif %}
制作两个不同的模板,并有条件地渲染其中之一:
$this->render($foo->bar === 'test' ? 'test.twig.html' : 'not_test.twig.html');
甚至:
$this->render($foo->bar . '.twig.html');
另请注意,大多数
if
语句可以缩写为三元数,并且 Twig 支持速记三元数,这使得:
{% if line.rate > 10 %}
{{ line.rate }}
{% endif %}
仅此:
{{ line.rate > 10 ? line.rate }}
如果循环的每次迭代都有一个大的模板块,您始终可以将行模板拉入其自己的部分:
{% for line in lines %}
{% include 'row_template.html.twig' %}
{% endfor %}