[英]Template language vs. straight PHP
我打算写一个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的模板语言是一种称为“ 内部平台效应 ”的反模式示例。 Smarty是PHP模板框架的一个例子,但即使是Smarty一书的作者Hasin Hayder也说Smarty已经死了 ,不再需要使用它了。
开发模板语言有充分的理由,例如,如果你有非编码器设计师或使用你的CMS的内容编辑器,你不想用PHP的复杂性来压倒他们(或允许他们编写可能的代码打破你的网站)。
但是您没有将其描述为目标,所以我假设使用PHP作为您的页面模板语言在这种情况下是最好的。 这样做的工作量会减少,因为您不必开发自己的新语言,并且可以为需要特定类型的动态内容的不常见情况提供更大的灵活性。
不要编写PHP函数来封装HTML输出块。 相反,使用include()
来拉入HTML片段。 这种技术有时被称为“部分”。
您还可以使用诸如Symfony,Kohana,Solar,CodeIgniter或Zend Framework之类的MVC框架来帮助您保持将PHP模板代码与其他应用程序代码分离的纪律。
我很长一段时间都是非常高兴的Smarty用户,我不再相信专门的模板语言了。
模板语言不会阻止您在演示文稿代码中添加不适当的逻辑,它只会强迫您在模板语言中编写错误的代码。
在模板中使用php创建自己的小模板系统是相当简单的。 然后创建各种帮助程序以保持模板代码清洁(如“navigation()”函数)。
我认为Zend_View采用的方法非常好。 Symfony的视图层也相当整洁,但可能有点令人生畏。 您不必使用框架从中获取内容。 只需看看示例中的一些模板代码,看看是什么激发了你的灵感。
底线:忘记模板的特殊语言 - 只需对视图代码应用良好的设计意义,将复杂性从视图脚本中分解出来,并转化为可重用的帮助程序。
重新发明轮子大多数时候都是一个坏主意。
PHP已经是一种模板语言。 您不需要实现自己的。
至于Smarty,它是php最完整的模板系统,它仍然是一个坏主意。
关于这个主题的几篇文章:
很久以前就有了Smarty! 哈辛海德。 他实际上写了一本关于聪明的书,他不推荐它。
由Harry Fuecks撰写的PHP和模板 (php Anthology第1版的作者)
如果你想看看模板做得更好看看:
最终目标当然是通过促进业务逻辑和表示的分离来更容易地维护代码
您可能想要了解Smarty- http://smarty.php.net Smarty是一个非常强大的模板引擎,可以为您提供两全其美的功能。 它广泛支持自定义模块和插件。
我用Smarty和PHP构建了一个自定义CMS,除此之外别无他法。
使用Smarty的PHP代码看起来像这样
<?php
// my cms
$smarty = new Smarty();
.
.
$smarty->display('home.tpl');
?>
模板代码是这样的
<h1>{$pagetitle}</h1>
{insert tag="navigation"}
我想知道为什么没有人提到模板语言最重要的用途之一:自动输出转义。
在这里或那里很容易忘记htmlspecialchars(),所以提供像{$ name}这样的指令的模板语言必须确保$ name 自动通过htmlspecialchars传递,并带有相应的charset和所有内容。
当然,这也意味着您可以为变量输出指定不同的“上下文”,例如alert('Hi {$ name | context = singlequotes}!'); 模板解释器将转义$ name的内容,以便不可能打破单引号,而不是转义它的XML(应该是默认值)。
这样的上下文还可以包括int(强制数字)等内容,也可以扩展为接受其他参数来格式化输出等。
我的2美分。 不确定是否有一个允许这样的开源解决方案(有兴趣听听它!),我在工作中为这些东西推出了自己的解释器。 由于生成的“中间代码”是纯PHP,它也可以很容易地“缓存”(如Smarty和其他tpl系统一样)。
我非常喜欢Smarty,我也认为控制器应该纯粹用XML编写,YAML中的模型。 这是强制执行MVC的唯一方法。
如果出现性能问题,那么编译到php可能会被认为是一种可能性(尽管是远程的),它具有以混淆方式完成的必要条件,以阻止急切的开发人员阅读它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.