模板语言与纯PHP

模板语言与纯PHP,php,templates,Php,Templates,我打算写一个CMS,但现在我正在写下我所有的想法,并试图在开始之前把我所有的概念弄清楚。其中一件让我头疼的事情是,是使用模板语言解析网站页面,用内容项替换模板标签,还是用纯PHP开发网站,让CMS生成数据结构来提供帮助。例如: {navigation: products} vs foreach($cms_标签['products']作为$product){ echo''。 ''. “\n”; } 前者更简洁,但它需要发明一种语言,再加上在显示之前解析每个页面。后者不太干净,但我认为如果CMS

我打算写一个CMS,但现在我正在写下我所有的想法,并试图在开始之前把我所有的概念弄清楚。其中一件让我头疼的事情是,是使用模板语言解析网站页面,用内容项替换模板标签,还是用纯PHP开发网站,让CMS生成数据结构来提供帮助。例如:

{navigation: products}
vs

foreach($cms_标签['products']作为$product){
echo'
  • '。 ''. “
  • \n”; }
    前者更简洁,但它需要发明一种语言,再加上在显示之前解析每个页面。后者不太干净,但我认为如果CMS只提供所有代码的数据,它会非常有效。但是,这会被认为是逻辑与表现的混合吗?我考虑过的另一种选择是使用类似于模板标记的PHP函数:

    <?php navigation('products'); ?>
    
    
    
    你的想法是什么


    记住,我不需要做任何比在某个地方包含一页或写一个无序列表更复杂的事情;其余部分将由CSS处理。

    您可能需要研究Smarty-Smarty是一个非常强大的模板引擎,它为您提供了两全其美的功能。它广泛支持自定义模块和插件

    我用Smarty和PHP构建了一个定制的CMS,关于它,我只想说些好话

    使用Smarty的php代码如下所示

    <?php
    // my cms
    
    $smarty = new Smarty();
    .
    .
    $smarty->display('home.tpl');
    
    ?>
    
    <h1>{$pagetitle}</h1>
    
    {insert tag="navigation"}
    
    
    
    模板代码如下所示

    <?php
    // my cms
    
    $smarty = new Smarty();
    .
    .
    $smarty->display('home.tpl');
    
    ?>
    
    <h1>{$pagetitle}</h1>
    
    {insert tag="navigation"}
    
    {$pagetitle}
    {insert tag=“navigation”}
    
    很长一段时间以来,我一直是一个非常快乐的Smarty用户,我不再相信专门的模板语言

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

    在模板中使用php的小模板系统的滚动非常简单。然后创建各种帮助程序以保持模板代码干净(如“navigation()”函数)

    我认为Zend_View采取的方法非常好。Symfony的视图层也相当整洁,但可能有点吓人。您不必使用框架从中获取某些信息。只要看看示例中的一些模板代码,就知道是什么启发了您


    一句话:忘了模板的特殊语言吧——只需对视图代码应用良好的设计意识,将复杂性从视图脚本中分解出来,并转化为可重用的帮助程序。

    PHP模板语言就是一个名为“.”的反模式示例。Smarty是PHP模板框架的一个示例,但即使Hasin Hayder,一本关于Smarty的书的作者说,没有必要再使用它了

    开发模板语言可能有很好的理由,例如,如果您的CMS中有非编码设计师或内容编辑器,并且您不想让PHP的复杂性压倒他们(或者允许他们编写可能破坏您网站的代码)

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

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


    您还可以使用诸如Symfony、Kohana、Solar、CodeIgniter或Zend framework之类的MVC框架来帮助您遵守将PHP模板代码与其他应用程序代码分离的规则。

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

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

    至于Smarty,它是php最完整的模板系统,这仍然是个坏主意

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

    • 哈辛·海德。他实际上写了一本关于smarty的书,但他不推荐

    • 作者Harry Fuecks(php文集第一版的作者)

    如果您想查看模板,请查看:

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

    当然,最终的目标是通过促进业务逻辑和表示的分离,使代码更易于维护。我想知道为什么没有人提到模板语言最重要的用途之一:自动输出转义

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

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

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


    我的2美分。我不确定是否有一个开源的解决方案可以实现这一点(我很想听听!),我在工作中使用了自己的解释器。由于生成的“中间代码”是纯PHP,它也可以很容易地被“缓存”(就像Smarty和其他tpl系统一样)。

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

    如果只出现性能问题,则编译