【问题标题】:Template language vs. straight PHP模板语言与直接 PHP
【发布时间】:2009-09-14 22:45:29
【问题描述】:

我要编写一个 CMS,但现在我正在写下我的所有想法,并在开始之前尝试弄清楚我的所有概念。我被撕裂的一件事是是否使用模板语言并解析网站的页面,并用内容项替换模板标签,或者只是用直接的 PHP 开发网站并让 CMS 生成有帮助的数据结构。例如:

{navigation: products}

对比

foreach($cms_label['products'] as $product) {

    echo '<li class="product_nav">'.
         '<a href="products/{$product.id}">{$product.name}</a>'.
         "</li>\n";

}

前者更简洁,但它需要发明一种语言,以及在显示之前解析每个页面。后者不太干净,但我认为如果 CMS 只为所有代码提供数据,它可以工作得非常好。但是,这会被视为将逻辑与表示混合吗?我考虑过的另一种选择是使用类似于模板标签的 PHP 函数:

<?php navigation('products'); ?>

你有什么想法?

请记住,我不需要做任何比在某个位置包含页面或写出无序列表更复杂的事情;其余由 CSS 处理。

【问题讨论】:

标签: php templates


【解决方案1】:

PHP 的模板语言是一种名为“Inner-Platform Effect”的反模式示例。 Smarty 是 PHP 模板框架的一个示例,但即使是有关 Smarty 的书的作者 Hasin Hayder 也表示 Smarty is dead 并且没有必要再使用它了。

开发模板语言可能有充分的理由,例如,如果您有使用 CMS 的非编码设计人员或内容编辑人员,并且您不想让 PHP 的复杂性压倒他们(或允许他们编写可能会破坏您的网站的代码)。

但是您没有将其描述为目标,因此我认为在这种情况下使用 PHP 作为您的页面模板语言是最好的。由于您不必开发自己的新语言,因此工作量会减少,并且它会为您需要特定类型的动态内容的不常见情况提供更大的灵活性。

不要编写 PHP 函数来封装 HTML 输出块。相反,使用include() 来提取 HTML 片段。这种技术有时被称为“partials”。

您还可以使用诸如 Symfony、Kohana、Solar、CodeIgniter 或 Zend Framework 等 MVC 框架来帮助您遵守将 PHP 模板代码与应用程序代码的其余部分分开的纪律。

【讨论】:

  • 我在 codeigniter 上构建它。另外,如果需要在 PHP 中指定部分 HTML 怎么办?对于输出列表(如我的示例中),我认为使用包含是不必要的。不需要写出“some-specific-navigation.html”并包含它,对吗?至于页面,它们不会即时生成。
  • 我的意思是我将所有 HTML 保存在模板文件中,而我编写 PHP 函数(如您提到的示例 navigation())只是为了向模板提供数据。即使在模板中也不要回显 HTML 标签。当您需要文字 HTML 标记时,退出 &lt;?php ?&gt; 块。
  • 我只是觉得写&lt;a href="products/{$product.id}"&gt;{$product.name}&lt;/a&gt;比写&lt;a href="products/&lt;?php echo $product.id; ?&gt;"&gt;&lt;?php echo $product.name; ?&gt;&lt;/a&gt;更干净
  • @Carson:当然,好点,我同意。尽管如此,我还是尽量减少完整 HTML 标记的“回声”。
  • 只是好奇你是否仍然对模板有同样的感觉。
【解决方案2】:

很长一段时间以来,我都是一个非常快乐的 Smarty 用户,我不再相信专门的模板语言。

模板语言不会阻止您在演示代码中添加不适当的逻辑,它只会迫使您使用模板语言编写错误的代码。

推出您自己的在模板中使用 php 的小模板系统相当简单。然后创建各种帮助器来保持模板代码的干净(比如你的“navigation()”函数)。

我认为 Zend_View 采用的方法非常好。 Symfony 的视图层的东西也相当简洁,但可能有点吓人。您不必使用框架来从中获取一些东西。看看示例中的一些模板代码,看看有什么启发你的。

底线:忘记模板的特殊语言——只需将良好的设计感应用于您的视图代码,将复杂性从视图脚本中剔除到可重用的帮助程序中。

【讨论】:

    【解决方案3】:

    在大多数情况下,重新发明轮子是个坏主意。

    PHP 已经是一种模板语言。你不需要自己实现。

    Smarty 是最完整的 php 模板系统,但它仍然是个坏主意。

    关于这个主题的几篇文章:

    如果您想查看模板做得更好,请查看:

    • phpSavant 它使用 php 代码并且仍然促进关注点分离。

    最终的目标当然是通过促进业务逻辑和表示的分离

    来更容易维护代码

    【讨论】:

      【解决方案4】:

      您可能想了解 Smarty-http://smarty.php.netSmarty 是一个非常强大的模板引擎,它可以为您提供两全其美的功能。它广泛支持自定义模块和插件。

      我用 Smarty 和 PHP 构建了一个定制的 CMS,除了好话之外别无他求。

      使用 Smarty 的 php 代码如下所示

      <?php
      // my cms
      
      $smarty = new Smarty();
      .
      .
      $smarty->display('home.tpl');
      
      ?>
      

      模板代码是这样的

      <h1>{$pagetitle}</h1>
      
      {insert tag="navigation"}
      

      【讨论】:

      • 我会推荐 Dwoo [ dwoo.org ] 而不是 Smarty。拥有 Smarty 的大部分功能而不会臃肿。
      • +1 我在很多项目中都使用过 Smarty,尽管那是不久前的事了,所以可能还有其他引擎可供检查(例如,Dwoo,正如 MitMaro 所提到的) )。根据我的经验,模板语言最重要的问题是防止业务逻辑潜入其中。这通常意味着需要做一些额外的工作来确保只向模板提供您想要显示的信息,而只将格式和显示结构留给模板代码。
      【解决方案5】:

      我想知道为什么没有人提到模板语言最重要的用途之一:自动输出转义。

      在这里或那里很容易忘记 htmlspecialchars(),因此提供像 {$name} 这样的指令的模板语言必须确保 $name 自动通过 htmlspecialchars 传递,并带有适当的字符集和一切。

      当然,这也意味着您可以为变量输出指定不同的“上下文”,例如alert('嗨 {$name|context=singlequotes}!');模板解释器将转义 $name 的内容,这样就不可能打破单引号,而不是 XML 转义它(这应该是默认值)。

      这样的上下文还可以包括 int 之类的东西(强制一个数字),它还可以扩展为接受额外的参数来格式化输出等。

      我的 2 美分。不确定是否有允许这样做的开源解决方案(有兴趣听到它!),我在工作中为这些东西推出了自己的解释器。由于生成的“中间代码”是纯 PHP,它也可以很容易地被“缓存”(就像 Smarty 和其他 tpl 系统一样)。

      【讨论】:

      • 这是一个很好的观点,我以前没有考虑过。但是这不能用 PHP 函数而不是模板标签来轻松完成吗?
      • 是的,但关键是很容易忘记调用 htmlspecialchars() 或在
      • 非常正确。我想我会使用 PHP 作为模板语言,并使用我自己的函数作为具有内置安全性的“模板标签”——而不是呼应任何东西。这对我来说是一个很好的妥协。
      【解决方案6】:

      我非常喜欢 Smarty,我也认为控制器应该完全用 XML 编写,模型应该用 YAML 编写。这是强制执行 MVC 的唯一方法。

      如果只出现性能问题,那么编译到 php 可能被视为一种可能性(尽管是远程编译),但前提条件是它以一种混淆的方式完成,以阻止热心的开发人员阅读它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 2011-04-30
        相关资源
        最近更新 更多