框架和模板引擎有什么区别?

mag*_*agy 12 php frameworks template-engine

zendframework和像smarty这样的模板引擎之类的框架有什么区别?

作为初学者,我应该从哪开始?

Fla*_*ius 6

模板引擎可以让网页设计师的生活更轻松.框架适用于程序员.

框架可以包含一个或多个模板引擎.由于框架适用于程序员,因此新的或程序员自己的模板引擎可以嵌入到框架中.

作为一个不需要与设计人员合作的程序员,在PHP中你并不需要模板引擎,因为PHP本身可能被(X)HTML代码包围.

创建模板引擎,作为程序员

作为PHP本身可以用作模板引擎这一事实的证明,以下是如何从视图逻辑中分离业务逻辑.

这是一个家庭支持的虚拟模板引擎.它不完整,不安全.它只是一个原型,向您展示模板的基本概念.

你可能已经听说过MVC - 或者不是 - 它没关系.下面描述的做法与它类似,但您不必编写OOP或使用框架

您的"视图"只是从您的脚本中获取一些变量的模板.在主脚本(这里是greet.php)中,您只执行"业务逻辑"."业务逻辑"包括所有数据库操作,使用会话,执行所有数学运算并检查有效输入,最终对其进行过滤.

然后,您所要做的就是存储要在中间变量中显示的数据.在下面的示例中,这是$ title,$ name,$ showdata和$ errors.

函数render()做了一件重要的事情:它通过使用变量的自动范围来隔离要从我们脚本的业务逻辑的外部世界中包含的模板 - 来自关联数组的变量extract() 'ed是本地的render() - 整个模板仅存在于该函数中.

请注意,变量extract()'ed是以第二个参数render()的关联索引命名的.如果您的模板不需要不同的变量名称,那么您可以通过初始化数组来剪切一些行,如下所示:

$export = compact('title','name','showdata','errors');
Run Code Online (Sandbox Code Playgroud)

变量$ do_greet将不再存在于模板中.相反,将使用与业务逻辑脚本相同的名称来知道相同的变量,即$ showdata.

greet.php

<?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;
}
Run Code Online (Sandbox Code Playgroud)

关于这样的模板的一个重要注意事项:如果您尝试在模板中访问全局数据,数据库连接,超全局数组,如$ _SESSION,$ _GET,$ _POST,$ _COOKIE,$ _FILES,$ _SERVER等,那么您就是没有正确使用这种技术.您的目标是将逻辑与视图完全分开.

如果确实需要此类数据,请通过中间变量使其可用于视图,例如:

$export = array(
        'title' => $title,
        'name' => $name,
        'do_greet' => $showdata,
        'errors' => $errors,
        'referer' => htmlentities($_SERVER['HTTP_REFERER'])
);
Run Code Online (Sandbox Code Playgroud)

以下是视图或模板greet_view.php的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">                                                                                  
<head>
        <title><?php echo $title ?></title>
</head>
<body>
<?php
if($do_greet) {
        echo 'Hi ',$name;
}
if(count($errors)) {
        if(count($errors)>1) {
                echo '<p class="error">',implode('</p><p class="error">',$errors),'</p>';
 }
 else {
                echo '<p class="error">'.$errors[0].'</p>';
 }
}
?>
<form method="post">
        <input name="name" />
        <input type="submit" name="submit" />
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

免责声明:提供的代码不干净,也不安全或完美.我的意图只是让你走上正轨.这是你的工作做更多的研究.


框架

那是模板引擎的一部分.框架提供功能(以函数和/或类的形式)以解决常见问题,例如认证,授权,将请求路由到适当的文件/类(MVC世界中的控制器)等.

CMS不同,此功能尚未准备好按原样使用.框架的不同组件必须由程序员连接在一起.因为程序员只需要进行这种连接,而不是(重新)为每个项目反复编写该功能,所以框架使编程更加愉快,让程序员专注于实际的项目特定问题.

像上面介绍的模板引擎可以是该框架的一部分,而render()函数可以是控制器的方法(以MVC术语).


fab*_*rik 4

框架比模板引擎更复杂。框架可以包含模板引擎,但不能包含模板引擎。框架可以通过多种方式帮助您构建(Web)应用程序。模板引擎只是用于将变量解析到预先格式化的 html 模板中。