【问题标题】:how to use Smarty better with PHP?如何在 PHP 中更好地使用 Smarty?
【发布时间】:2012-10-09 20:27:12
【问题描述】:

我发现在 PHP 中使用 Smarty,有时会需要额外的时间

1) 使用与 PHP 本身完全不同的语法
2)需要检查小案例,因为文档没有提供更详细的细节,例如“逃生”

http://www.smarty.net/manual/en/language.modifier.escape.php

它没有说escape:"quotes" 仅用于双引号或单引号,因此您需要编写代码来测试它。同样对于 escape:"javascript" 的情况——不能准确地告诉它是什么以及它是如何被转义的。

3) 对于复杂的事情,需要编写辅助函数或修饰符,因此需要创建新文件并最终在 PHP 中完成。

顺便说一句,与单独使用 PHP 相比,使用 Smarty 是否提供了很好的加速?谢谢。

【问题讨论】:

    标签: php smarty template-engine templating


    【解决方案1】:

    首先,PHP 是一种模板语言。当您谈论为基于 PHP 的 Web 应用程序使用模板系统时,请记住这一点。

    我听说过使用任何模板引擎的唯一“真正”的论点是,它们为模板操作提供了一种更简单的语言,如果您的模板设计者不了解 PHP 而您不了解 PHP,这将非常方便。不要相信学会明智地使用 PHP。

    关于这些论点,我认为如果您的模板设计师没有能力学习足够的 PHP 进行模板设计,您可能应该考虑寻找新的模板设计师。此外,PHP 本身为您可能在模板和代码中使用的控制语句提供了不同的语法。例如:

    <? foreach($array as $key => $val): ?>
        <?= $val ?>
    <? endforeach; ?>
    

    VS:

    <?php
        foreach($array as $key => $val) {
            echo $val;
        }
    
    ?>
    

    就我个人而言,我认为模板引擎出现在 PHP 中是因为:

    1. 其他语言都是这样的
    2. 更好的 PHP 程序员意识到他们需要一种方法来强制分离表示和应用程序逻辑,而模板是一种简单的方法。

    第一个原因有点傻。第二个原因可以通过一点点自我控制来克服,甚至对应用程序中分离层的必要性有一个基本的了解。 MVC 设计模式是解决这个问题的一种方法。至于锻炼一些自我控制,我的规则是只使用必要的循环和 if 语句以及过滤、转义、格式化屏幕输出的函数。

    在广泛使用 Smarty 之后,老实说,它总是给我带来比解决方案更多的障碍来克服。如果有的话,切换到基于 PHP 的模板实际上减少了模板和代码的开发时间。

    【讨论】:

    • +1 表示真相。顺便说一句:您的代码中有一个错误:$val++ 应该是 echo $val 以匹配第一个代码示例。
    • 然而他们添加了 {PHP}{/PHP} 标签,所以我可以在那里进行所有数据库查询;)
    • 只是你忘了提到你不能依赖短语法,因为它很可能被禁用。因此,如果您正在开发不仅在您的机器上运行的严肃项目,那么您将不得不用&lt;?php echo $var ?&gt; 淹没您的页面。现在与{$val} 相比,这看起来不那么性感了,是吗?
    【解决方案2】:

    我不喜欢模板引擎。我发现它们对于 PHP 来说非常有损且资源密集。

    对于 MediaWiki,在 1.6.x 版本左右,我们默认放弃使用 Smarty,而只使用 PHP 的内置模板,性能有了很大提高。

    我发现人们想要使用模板系统执行的大部分操作(添加链接、更改颜色、删除文本或页面部分)最好使用简单的事件挂钩系统来完成。

    Laconica 是开放的微博平台,默认不做任何模板化。我们为喜欢模板的人准备了一个插件。

    【讨论】:

      【解决方案3】:

      Smarty 无疑是目前最好的模板引擎之一。根据我的经验,虽然建议人们在使用 PHP 之上的任何模板引擎之前更彻底地考虑他们的用例。

      首先,PHP 本身非常适合模板。几乎使用另一个模板引擎的唯一理由是,如果您允许不受信任的用户创建或编辑模板,因为他们可能会执行各种错误。因此,如果您的项目有用户可编辑的模板,请使用 Smarty。如果没有,请坚持使用 PHP。

      如果你的问题是代码和布局的分离,我建议你考虑实现一个轻量级的 MVC 风格的执行模型。或者,更谦虚地说,如果您的模板中有更深层次的逻辑代码,那么可能是时候进行一些重构了。

      性能是另一个考虑因素。是的,渲染 Smarty 模板是有代价的。但是在完成之后,应该缓存输出,从而缩短执行时间。 PHP 模板也是如此。 PHP 允许您通过使用其输出缓冲区来实现各种粒度缓存模型。但请注意过早的优化:只有在您完成代码并确定实际瓶颈是什么之后才这样做!

      使用 Smarty 或任何其他引擎的最大成本来自于开发人员的时间。这是另一层复杂性,您不可避免地会发现自己处于必须欺骗引擎完成在纯 PHP 中本来可以完成的事情的情况。

      【讨论】:

        【解决方案4】:

        我喜欢模板引擎并认为应该使用它们,但在 Smarty 的特殊情况下,我认为这是浪费时间,因为它对作为模板语言的 PHP 没有显着改进:

        • 新语法仍然基于在文档中随机插入特殊标签的旧概念。
        • 由于 Smarty 不理解 HTML 的语法/结构,它不能不帮助您创建有效/格式良好的 HTML。 Smarty 的标签违反了 HTML 的语法,所以一旦你添加了它们,其他标准工具也帮不了你。
        • Smarty 的输出,就像在 PHP 中一样,默认情况下是不安全的(未转义的),您必须记得在以 HTML 格式输出数据的任何地方添加 |escape

        我爱上了一个特殊的 PHP 模板引擎,它解决了所有这些问题:PHPTAL

        这仍然是你必须学习的新东西,它对你的应用程序来说是一种依赖,但我认为解决 XSS 和格式错误的问题是值得的。

        PHPTAL 就像 Smarty 一次编译成 PHP 并缓存,因此性能与原始 PHP 相当。

        【讨论】:

        • 我喜欢 smarty 的一件事是过滤器,可以自动转义输出。在许多其他系统中您不会发现这一点。
        • @Vatos:恕我直言,这是一个缺陷,因为您必须使用该过滤器。如果您忘记了,您的输出将是不安全/无效的。适当的模板系统应该自动转义而不需要特殊的过滤器。
        【解决方案5】:

        优点

        • 您的 HTML 文件中没有 PHP(允许 PHP 和 HTML 标识)
        • 管道 {$var|default:"None selected"} {$var|urlencode}
        • Foreachelse:{foreach item=row from=$results}{$row.name}
          {foreachelse}没有结果{/foreach}
        • 可主题化的网站/页面(仅使用 CSS 有限制)

        缺点

        • 其他语言语法
        • 并非总是显而易见的代码 {"Y-m-d"|strftime:$timestamp} {$array|@var_dump}
        • 轻微开销

        我强烈推荐“模板”方法 (mVc),但 Smarty 和普通 PHP 都可以胜任。

        【讨论】:

          【解决方案6】:

          据我所知,Smarty 是速度方面最好的模板引擎之一。也许需要一段时间才能习惯。但是,如果您不是单独在系统上工作,并且 html 和样式文件的数量很大,那么它会显着加快开发速度。

          在处理我的上一个项目时,设计更改了几次,但逻辑是相同的。我想这是 Smarty 或任何其他模板引擎有很大帮助时的最佳示例。

          【讨论】:

            【解决方案7】:

            我个人使用 Blitz 进行模板化。在该网站上,作者声称它是最快的模板引擎,并提供了一个(有偏见的?)图表,显示了 PHP 的不同模板系统之间的性能。我自己没有使用 smarty,但这可能会给你一些关于它的性能的提示。

            http://alexeyrybak.com/blitz/blitz_en.html

            【讨论】:

              【解决方案8】:

              使用 Smarty 作为模板引擎的性能可能不如不使用它,因为它是一个额外的软件层,即在另一种模板语言 erm 之上的模板语言。另一方面,如果您正确使用缓存功能,您可以实现整体性能提升。

              Smarty 模板在输出到浏览器之前会进行预编译,这涉及将临时文件写入磁盘。这一步肯定会惩罚性能,至少是一点点。

              如果您对将实现和表示分开的能力充满信心,并且对服务器端缓存没有真正的兴趣,那么您可能应该只使用纯 php 模板。一些 MVC 框架,例如 Zend Framework 有自己的类似 PHP 的模板系统。

              另一方面,smarty 是一种很好的方式,可以将表示与实现巧妙地分开,尤其是在不清楚什么属于哪里的情况下。它可能有助于约束您强制执行这种必要的分离。

              也就是说,我在我的大部分 PHP 项目中都使用 Smarty,因为它让我想起了 Java-Server Tag Libraries (JSTL),我非常、非常习惯并喜欢它。

              【讨论】:

                【解决方案9】:

                是否使用 Smarty 或多或少是一种哲学立场。

                我使用它,虽然我不使用太多功能。以这种方式使用它,模板往往非常简单。传递带有参数的关联数组,遍历其组件并在结果页面中插入所需的元素。这使模板保持干净并且(希望)没有业务逻辑。

                此外,扩展 Smarty 非常简单。

                作为示例,我在 fetch() 中添加了一个样式参数,以具有 fetchUsingStyle()。这让我可以很容易地在网站的不同布局之间切换。

                此外,我的 fetchUsingStyle() 会在不同位置搜索模板:首先尝试查找当前样式。如果未找到,它会尝试使用默认样式加载模板。最后,它会尝试定位一个纯静态的虚拟文件,一个占位符,以便稍后实现。

                【讨论】:

                  【解决方案10】:

                  尝试将 Smarty 与 Codeigniter 等 MVC 模式一起使用,它比核心 PHP 更好

                  【讨论】:

                    【解决方案11】:

                    当您可以使用 html 文件并在需要的地方注入 php 代码时,为什么还要使用模板引擎?你可以用 Psttt 做到这一点! php模板引擎

                    这里有完整的源代码http://github.com/givanz/psttt

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-02-04
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-10-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多