【问题标题】:What's a good templating system for PHP? [closed]什么是 PHP 的好模板系统? [关闭]
【发布时间】:2008-10-13 12:46:45
【问题描述】:

什么是最好的/最容易集成 PHP 模板系统,使用它有什么好处?

我目前根本不使用它,我认为这可能有助于将内容与演示文稿分开更多一点。

【问题讨论】:

标签: php templates


【解决方案1】:

PHP 本身就是一种很好的模板语言。由于这个原因,大多数领先的 PHP 框架不使用单独的模板语言。

只要确保您使用(类似的)MVC,并且不要在您的视图文件中执行任何数据访问或业务逻辑。

我也广泛使用 Smarty,但发现它与直接的 PHP 相比没有什么优势,除了强迫你保持你的观点愚蠢。对设计师来说,它可能看起来也更好一些,但对你来说,它的缺点是灵活性,模板实现者。循环三重嵌套数组之类的事情比直接使用 PHP 更难。

【讨论】:

  • 亚历克斯,你当然是对的。然而,“让你的观点保持沉默”(对于设计人员/非编程人员)通常正是使用模板系统的原因。除了让它表面上更容易之外,它还可以防止“愚蠢”用户的(致命)错误。
【解决方案2】:

Smarty


我发现它快速、易于使用且易于安装(即使在共享主机环境中)。它也不需要您使用验证 XHTML,这有时很方便(尽管我认为 确实 需要有效 XHTML 的模板引擎可能更快。)

将您的内容放在一个地方并在另一个地方编写代码真是太好了。

此外,您不仅限于 HTML。我使用 Smarty 生成 XML 甚至 SQL

【讨论】:

  • 它也非常适合以纯文本和 HTML 格式生成电子邮件。
  • 这是一个很好的例子,我没有考虑过。
【解决方案3】:

要跟进 Alex 所说的话,我建议看一下 Rasmus Lerdorf 的文章 The no-framework PHP MVC framework

Rasmus Lerdorf 是 PHP 的创始人。

【讨论】:

  • 这和他不使用模板引擎有什么关系?
  • 这不是框架,而是框架!代码绝对可怕:在代码中生成 Html。每个控制器类都必须重复相同的包含,并且没有可用的路由,因为 Rasmus 对前端控制器有一些不合逻辑的过敏。
【解决方案4】:

我赌PHPTAL

它检查文件语法并确保输出是格式良好的 XML带有适当的转义。这可确保页面安全地抵御 XSS 攻击,而程序员不必每次都担心。

Smarty 和原始 PHP 不会自动处理转义,这意味着每个 echo $foo${foo}(没有 |escape}htmlspecialchars())都可能是 HTML 注入漏洞或至少破坏格式良好。

PHPTAL 有很好的语法,适合 HTML/XML 的工作方式,例如当您想有条件地将某些内容包装在标签中时,您不必重复自己:

<strong tal:omit-tag="condition">
  xxx
</strong>

而不是:

{if condition}<strong>{/if}
  xxx
{if condition-again!}</strong>{/if}

而且语法是 XML,不会过于冗长(主要是添加属性)。没有 HTML 和自定义标记类结构的丑陋组合。

【讨论】:

  • 对于每个他自己的,我认为 tal:omit-tag 是丑陋的。另外,如果强标签之间有很多数据,当您到达结束标签时可能并不明显,它可能并不总是存在。
  • 我放弃了 phptal 有 3 个原因: 包含带有“metal:”命名空间的部分模板令人困惑和丑陋。对于更复杂的视图逻辑,TAL 标签可能会变得冗长和混乱。创建自定义修饰符很痛苦。
  • @DGM:你可能会忘记它是可选的,但它不会像在其他引擎中忘记它那样产生重大后果(这会让你有不同步的开始和结束标签,这绝不是一件好事)。
  • @rick:我必须同意金属:- XML 不允许在头文件中打开正文并在页脚中关闭的常见模式。然而,自定义修饰符可以使用函数 phptal_tales_modifiername() 来完成。
  • 我尝试使用 "phptal_tales_modifiername()" 但我不喜欢全局函数,它只允许一个参数,我不明白 "nothrow" 和需要调用 "phptal_tales($src , $nothrow)" 来自我的修饰函数。
【解决方案5】:

除了 Mark 的经验,我发现 Smarty 非常适合扩展。我已经构建了一个(企业)MVC 框架,它带有基于 Smarty 的内置视图,既简单又灵活。大量可用的模板帮助函数也可以很容易地扩展。

【讨论】:

  • 我也是。此外,我使用 Smarty 的友好视图包装器,它使用间接 getter/setter 将变量分配给 Smarty 标记。感谢 __toString 视图可以很容易地嵌套在视图中。
【解决方案6】:

也许使用模板引擎最令人信服的原因是默认输出转义可以减少或消除 xss 漏洞。

【讨论】:

    【解决方案7】:

    这取决于您的关注点:不同的模板引擎可以更好地处理不同的事情。 Smarty 与某些相比相对较重,并且定义了一种比 PHP 更简单但更受限制的语法。使用不像编程语言的语法有很多好处,例如,如果您要请图形设计师构建您的模板。

    诸如Savant3 之类的模板引擎,或者在Zend FrameworkZend_View 组件中使用的模板引擎是轻量级的,并且使用PHP 作为其语法。这为您的模板提供了更多的功能和灵活性,但要求您遵守将业务逻辑排除在模板之外的规则。此外,如果您的设计师要构建模板,PHP 语法可能过于复杂。

    【讨论】:

      【解决方案8】:

      我个人喜欢只使用单独的 PHP/HTML 文件的想法。它允许我根据需要使用其他 HTML 编辑器(例如 DreamWeaver),还可以让不懂 PHP 但知道 HTML 的人无需学习另一种语言即可编辑模板。

      【讨论】:

      • 你是如何做到这一点的?
      • 简单的答案:在您的 PHP 文件中,您包含另一个 PHP 文件,其中包含 HTML 和一些简单的 PHP。并且无论何时您在 PHP 文件中生成 HTML,请尝试将其移至 HTML(但仅在有意义的情况下,不要让事情变得太复杂)。如果这回答了您的问题,或者您想要一个示例,请告诉我。
      • 对,所以您说的是-simple- php 脚本,它们确实具有一些php 语法,而不是纯粹的html 文件。我想知道您是否指的是 php 语言的 clojure 的 enlive(stackoverflow.com/questions/3248235/…,它在纯 html 上使用 css 选择器来重构它)这样的系统,因为我一直在研究这种可能性。
      • 我更喜欢使用 PHP 内置的东西,而不是创建其他需要对每个页面请求进行额外处理的东西。
      • 一般来说只是为了制作更脏的模板。
      【解决方案9】:

      我已经使用 Smarty 很多年了,但是因为特殊的 smarty 语法阻碍了我的使用而感到沮丧,在这种情况下,一些简单的 php 会更容易。 PHP 本身就是一种模板语言!我了解到 php api 足够适合所有的表示逻辑。

      因此,Savant3 及其后代 Zend_View 是出色的解决方案。就像在 Smarty 中一样,您可以轻松地为重复性任务编写插件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 2010-09-30
        • 2010-12-28
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        相关资源
        最近更新 更多