当我为网站编写PHP代码时,我不喜欢将业务逻辑与表示层混合,因此我倾向于创建标记模板。我已经编写了一个非常轻量级的模板引擎来实现这一点,因为我真的不想转向像Smarty这样的完全成熟的模板框架。
以下是我所做的简化示例:
function renderTemplatePage($page, $params)
{
$page = readTemplateFile("templates/{$page}");
$tokens = getTemplateTokens($page);
foreach($tokens as $token)
{
if(substr($token, 0, 6) == "%_TPL_")
{
$subPage = renderTemplatePage(tokenToPageName($token), $params);
$page = str_replace($token, $subPage, $page);
}
else
{
$page = str_replace($token, $params[$token], $page);
}
}
return $page;
}
示例页面:
<html>
<head><title>%_PageTitle_%</title></head>
<body>
<div id="header">%_TPL_Header_%</div>
<div id="content">%_TPL_Homepage_%</div>
<div id="footer">%_TPL_Footer_%</div>
</body>
</html>
拨打renderTemplatePage("index", array("PageTitle" => "Home"))
会产生一个名为“Home”的页面,其中包含来自页眉,主页和页脚模板的内容。
在调用渲染之前,我完成了所有逻辑(包括数据库查询等),因此我可以组建一个大型$params
数组,只需执行一次调用就可以全部呈现。
这种方法有什么缺陷吗?有更标准的方法吗?
答案 0 :(得分:2)
它有缺陷。你如何处理模板特定的逻辑。出于好奇,您将如何处理ifs
或loops
答案 1 :(得分:0)
有几种方法可以实现逻辑和表示之间的分离(它正式被称为MVC的一部分 - 模型 - 视图 - 控制器方法)。
我想指出的一个方向是XML + XSLT。我们的想法是将您需要的所有信息组合为XML字符串(例如,查看以下URL的输出:http://www.whiteoctober.co.uk/?dumpXML),然后对其执行XSLT转换(请参阅http://www.w3schools.com/xsl/xsl_transformation.asp)
PHP中的模板是一场宗教辩论 - 我宁愿不被拖入。我只想说我强烈反对Smarty - 它很笨重,并没有做任何标准的PHP没有做的事情。
答案 2 :(得分:-2)
所有这些自制模板的问题是缺乏现实生活测试 你没有做这样的测试,而是来这里问其他人 一般来说,这不是一个明智的策略,因为你自己的经验是必不可少的,而没有那么多专业人士有足够的时间给你一个扩展答案。虽然总有很多没有经验的用户准备回答。
这种方法有什么缺陷吗?
是的,当然。
您宣布don't like mixing business logic with the presentation layer
但是,%_TPL_
的内容是什么?它写的是什么?我想,在同样的旧业务逻辑中。那么,你想要的分离在哪里呢?