在PHP中模板化做对了......怎么样?

时间:2011-04-04 10:51:27

标签: php html template-engine templating

几年前我用PHP创建了一个小网站,现在已经发展壮大,你可能会猜到它有点混乱。虽然我确实有一个单独的模板来完成html的最终输出,但我仍然最终在代码的“业务逻辑”部分处理了很多html。

我的主要问题是该页面包含各种小部件(如“最新条目”,广告等),这些小部件在不同页面之间发生变化,因此其html-(模板)代码无法硬编码到模板中。事实上,即使是主要内容容器也是一个小部件,因为页面结构(或布局)始终是相同的。

所以我最终得到了一个带有$ templateData ['mainContent'],$ templateData ['widget1'],$ templateData ['widget2']等的数组,这些数组是在代码的业务逻辑部分生成的。

我该如何解决这个问题?

环顾四周,似乎有两种方法可以解决这个问题:

  1. 显而易见的方法是使用带继承的专用模板语言,包括像django那样,但考虑到这些语言的复杂程度,我并不是真的愿意学习另一种语言。我在django花费的时间里注意到的是它并不特别快(特别是因为它诱使人们使用css和javascript的模板)。

  2. 另一种选择是使用PHP本身提供的模板功能。但这意味着每个小部件都有自己的php模板,并通过包含模板文件并使用输出缓冲捕获结果来生成其html代码。这是一个好主意吗?因为我仍然在逻辑部分内部的变量内部结束HTML。此外,这不是滥用输出缓冲的东西不是为了它?性能怎么样? (我正在编写/读取/刷新的缓冲区在哪里?对ob_ *函数的调用有多贵?)

  3. 从我所看到的,两种变体都有倡导者。我个人更喜欢选项2(因为它是我已经在做的事情),但是html-in-variables感觉非常错误,我怀疑我是否会以这种方式解决任何问题。

    还有其他选择吗?你是怎么解决这个问题的?

5 个答案:

答案 0 :(得分:2)

之前我遇到过这个问题,而且我现在有几乎相同的想法/问题。我不得不学习模板语言。 Enter Twig一种受Django模板语言影响的轻量级模板语言。它的占用空间非常小,在内存使用方面几乎不可见。

给自己一些时间来适应它,然后决定你是否愿意。

答案 1 :(得分:2)

将那些漂亮的数组分配给smarty并学习在tpl文件上迭代它们。 它比看起来容易。 当你需要多次使用相同的html / php时,你只需要包含它。

http://www.smarty.net/

智能快速可靠吗?是

答案 2 :(得分:2)

为什么不让每个小部件只包含它的模板?
因此,您只需从主模板中调用小部件即可。

答案 3 :(得分:1)

一个想法是创建访问Web服务的模板驱动/视图驱动页面或提供所需数据的API。

您可以将URL链接到模板,模板可以通过Web服务(AJAX样式)或静态调用数据检索功能。

然后,业务逻辑部分仅限于输入的处理和准备通用检索,并提供例如机制。过滤或排序,而模板决定如何过滤,如何排序或如何分页等。

我建议您使用适当的对象关系映射(ORM)框架/ ActiveRecord模式(请参阅here on StackOverflowWikipedia),它允许您使用通用检索对象可以通过模板重新配置以满足其需要(例如上述过滤和排序)。

然后在需要时通过调用检索对象上的find()load()或类似方法等特殊方法,在模板中完成实际检索。

编辑:
关于其他人建议的模板框架,我不太喜欢它们,因为它们经常复制已在PHP中找到的功能,通过添加另一个解析器层来重新发明轮子;从任何体面的模板框架中获得的好处是缓存(可能有一些基于PHP的模板引擎也支持缓存)。

答案 4 :(得分:0)

多个选项

有几种方法可以做到。

这里有几个值得考虑的策略:

  • 使用在PHP对象的方法中封装(包含)的普通PHP视图。这就是 CakePHP 实现其观点的方式。

  • 使用< %%>等占位符加载HTML文件作为纯文本并使用正则表达式替换内容

  • 加载HTML文件并将其解析为XML或HTML。然后,您可以使用 Symfony's CssSelector component 之类的内容来添加,删除或替换内容,就像使用jQuery一样。然后,将其渲染回纯文本并echo

  • 使用以下常用模板引擎之一:

  • ...


最佳选择?

哪个选项最好?我想这取决于你的用例:

  • 普通的PHP总能为您提供最佳性能,但它也是最不易读的选项。

  • 如果您喜欢使用与jQuery相同的方式浏览HTML代码,则可能需要使用DOM-Query之类的库。

  • 如果您正在寻找可在后端和前端使用的经过良好测试的模板引擎,那么 Mustache 就是您的选择!

  • p>
  • ...