Template engines可以让网页设计师的生活更轻松.
Frameworks是程序员.
框架可能包含一个或多个模板引擎.由于框架适用于程序员,新的或程序员自己的模板引擎可能嵌入到框架中.
作为一名不需要与设计师合作的程序员,在PHP中,您并不需要一个模板引擎,因为PHP本身可能被(X)HTML代码包围.
创建一个模板引擎,作为一个程序员
作为PHP本身可以用作模板引擎的事实的证明,下面是如何将业务逻辑从视图逻辑中分离出来.
这是一个家庭支持的虚拟模板引擎.它不完整,不安全.它只是一个原型,向您展示模板的基本思想.
你可能已经听说过MVC – 不是没关系.下面描述的做法与之类似,但您不必编程OOP或使用framework
您的“视图”只是从脚本中获取一些变量的模板.在主脚本(这里是greet.PHP)中,你只做“业务逻辑”.
“业务逻辑”包括所有数据库操作,使用会话,执行所有数学和检查有效输入,最终过滤它.
那么你所要做的就是将要显示的数据存储在中间变量中.在下面的例子中,这是$title,$name,$showdata和$errors.
函数render()有一个重要的事情:它使用变量的自动范围隔离要从脚本的业务逻辑的外部世界中包含的模板 – 关联数组中的变量extract()由本地渲染() – 整个模板只存在于该函数中.
请注意,extract()’的变量以render()的第二个参数的关联索引命名.如果你的模板不需要不同的变量名称,那么你可以通过初始化数组来剪切一些行:
$export = compact('title','name','showdata','errors');
变量$do_greet将不再存在于模板中.相同的变量将与您的业务逻辑脚本(即$showdata)的名称相同.
greet.PHP
$title = 'Contact';
$name = 'Guest';
$showdata = FALSE;
$errors = array();
if(isset($_POST['submit'])) {
if(isset($_POST['name']) && $name = trim($_POST['name'])) {
$name = strip_tags($name);
$showdata = TRUE;
}
else {
$errors[] = 'Missing name.';
}
}
$export = array(
'title' => $title,'name' => $name,'do_greet' => $showdata,'errors' => $errors
);
render('greet_view.PHP',$export);
function render($template,$data) {
extract($data);
return include $template;
}
关于这样的模板的一个重要注意事项:如果您尝试访问全局数据,数据库连接,超全局数组,如
$_SESSION,$_GET,$_POST,$_COOKIE,$_FILES,$_SERVER等在你的模板,那么你没有正确使用这种技术.你的目的是完全将逻辑与观点分开.
如果您确实需要这样的数据,则通过中间变量将其提供给视图,例如:
$export = array(
'title' => $title,'errors' => $errors,'referer' => htmlentities($_SERVER['HTTP_REFERER'])
);
这是视图或模板greet_view.PHP的代码
<?PHP echo $title ?>if($do_greet) {
echo 'Hi ',$name;
}
if(count($errors)) {
if(count($errors)>1) {
echo '
',implode('
',$errors),'
';}
else {
echo '
'.$errors[0].'
';}
}
?>
免责声明:所提供的代码不干净,也不安全或完美.我的意图只是让你走上正轨.你的工作是做更多的研究.
框架
那是模板引擎的一部分.框架提供功能(以函数和/或类的形式)来解决常见问题,如认证,授权,将请求路由到适当的文件/类(MVC世界中的控制器)等等.
这个功能与CMS不同,它还没有准备好按原样使用.框架的不同组件必须由程序员连接在一起.因为程序员只需要做这个接线,而不是(重新)为每个项目一遍又一遍地写这个功能,一个框架使编程更加愉快,让程序员专注于实际的项目特定的问题.
像上面提到的模板引擎可以是该框架的一部分,render()函数可以是控制器的方法(在MVC术语中).