首先解决这里的答案和一般背景:
人们使用它们的主要原因是它们通常会使事情变得更简洁。这是否总是一个净收益值得怀疑。学习一门新语言而增加的认知负担和手头没有宿主语言的灵活性最终会带来比使用模板语言更多的缺点。 Twig 特别需要手动向其导出核心 PHP 函数。寻求简洁的最佳模板语言会更好,而不是使用标记器扩展 PHP。
自动转义是另一个值得怀疑的功能。对于代码非常糟糕的开发人员来说,自动转义可能更安全,但否则会削弱安全性,让人忘记它并提出在任何情况下默认情况下一切都是安全的期望。一个真正安全的模板引擎需要了解很多关于其上下文的信息,有时这并不总是可以确定的,只有程序员知道某些事情的去向。如果您需要安全编程,您需要有一个不依赖于自动转义的开发人员。这也是 PHP 实际上可以做的事情,如果您对 PHP 文件进行标记,您可以将原始文本与 PHP 分离并将 PHP 部分包装在输出缓冲中,然后应用您喜欢的任何过滤器,因此这不是模板语言独有的功能。
一些模板引擎可以使预生成更容易一些,预编译使它们更快,但这也可以通过原生模板来实现。有必要解析模板,这通常会降低它们的效率并且使用它们的过程更加复杂。引入的增加的复杂性模板意义重大。这通常可以从您身上抽象出来,但最终会困扰您,例如缓存问题(陈旧的条目),性能问题,调试时明显更多的混乱和混乱,更多的层和更多的代码被执行,更多可能出错等。
许多功能(例如扩展模板)无需使用 twig 即可实现。类似地,对于诸如 htmlspecialchars 之类的东西,大多数人会为他们经常使用的所有函数创建简短的辅助函数。
那么您应该肯定在哪里使用 Twig 等模板语言?
婴儿坐在糟糕的开发人员有点有效,尽管我不确定如果您必须使用诸如 twig 之类的东西来尝试包含它们,他们是否应该被视为开发人员。您还会惹恼优秀的开发人员,您会想知道为什么要让他们越过障碍来完成原本简单的事情。
您可能希望将模板提供给您可能希望处理 HTML 但不公开系统内部等的各方。例如,这可能是您拥有 CMS 的地方,用户可以编辑模板但与您的开发人员不同。这与上述情况有关,但这是一个更真实的案例,您可能会从中受益并且可能是合理的。
类似的情况是您可能希望在系统之间使用模板,在这种情况下,模板语言可以是一种可移植的解决方案。这可能不仅是您拥有多个后端的地方,而且您还有不寻常的架构要求,例如前向服务器从下游派生的数据呈现视图。更进一步,您可能需要可以呈现前端或后端的模板。如果您只需要将数据发送到前端,因为它可以自己呈现视图,那么这可能会更有效。但是,由于各种原因,您可能还必须回退到后端。
另一种情况是静态分析,包括跨多种语言。大多数语言通过字符串连接有效地进行模板化,并且不知道您正在生成的语言。在某些情况下,当您可以完全解析语言和 HTML 时,模板语言可以提供好处。实现这一点的另一种方法是尽可能多地使用 HTML 本身进行模板来表示事物,例如使用类等,以及 HTML 提供的允许您将行为附加到事物的工具。模板语言也可以比 PHP 更易解析,即使您无法解析您正在使用的模板语言。这可用于优化或拥有更容易转译的模板。
您的语言确实不适合创建 HTML 和其他语言。 PHP 是一种模板语言,因此在大多数情况下,使用模板语言几乎没有什么作用,但会产生很大的拖累。但是,如果您使用的是 Java 之类的东西,那么您很可能需要一个模板引擎。模板语言是一种 DSL,但如果你已经有一个 DSL 可以很好地完成它们的工作,那么它就是 YAGNI。
定制模板。如果您有特定的输出格式和域,可以从定制的模板语言中显着受益。这取决于您的输出格式。
所有这些情况都是针对特定情况的,并且不够普遍,因此默认情况下应使用模板语言。模板语言仅以不同程度的成功解决了这些问题(例如,许多不支持 HTML)。如果我将 Twig 排在 10 分(满分 10 分)中的每一项表现如何,那么平均分也不会差到 5 分。
您可以将 Twig 转换为 PHP,但不能将 PHP 转换为 Twig。这有时会很有用,但代价是相当大,因为您失去了 PHP 的很多灵活性。
在我接触过的少量 Twig 内部构件中,质量也很差,或者进口的标准不合格。例如,五年前我第一次尝试时,解析器不支持或至少不支持保留空格。我有一个需要重构的场景,这意味着我需要能够解析 Twig,修改并再次输出它以在数千个模板中重写代码,twig 不支持它,我不得不自己翻阅解析器。
同样,我最近调查了 Twig 的逃逸行为。特别是 JS 转义,它支持转义 JS 字符串和其他奇怪的东西,而不是简单地使用 json_encode。您在框架中得到的自定义转义很可能是错误的。自己做通常更可靠和安全(只要你知道如果你 JSON 编码一个包含它的字符串并将其模板化为没有足够转义的 javascript 文字会发生什么,例如)。
在大多数情况下,成百上千行的魔术模板系统和其他相关系统实施的转义、消毒等都是糟糕的做法,试图猜测您的场景或尝试迎合每一个可能的场景,从而为数据损坏的奇怪错误,增加更多安全错误的机会等。通常你会发现框架中的类似东西可以用更安全的一两行函数替换。您有时还会遇到其他愚蠢的事情,例如一遍又一遍地处理某些事情以防万一,因为框架对于您正在做什么很天真,好像您自己做的事情您确切地知道自己在做什么和不做什么'然后会有一些事情,比如一遍又一遍地清理同一个字符串。