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

13

Zendframework这样的框架和Smarty这样的模板引擎有什么区别?

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

4个回答

8

模板引擎的存在是为了让网页设计师的工作更轻松。框架则是为程序员而生。

框架可以包含一个或多个模板引擎。由于框架是为程序员而设计的,因此新的或程序员自己的模板引擎可以嵌入到框架中。

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

作为程序员创建模板引擎

作为证明PHP本身可以用作模板引擎的事实,这里展示了如何将业务逻辑与视图逻辑分离。

这是一个自制的虚拟模板引擎。它并不完整,也不安全。它只是一个原型,用来展示模板的基本思想。

您可能已经听说过MVC - 或者没有 - 这并不重要。下面描述的实践类似于它,但您不必编写OOP或使用framework
您的“视图”只是从脚本获取一些变量的模板。在主脚本(这里是greet.php)中,您只需执行“业务逻辑”。
“业务逻辑”包括所有数据库操作、会话处理、进行所有数学计算和检查有效输入,最终过滤它。
然后,您所要做的就是将要显示的数据存储在中间变量中。在下面的示例中,这是$title、$name、$showdata和$errors。
函数render()的一个重要作用是使用变量的自动作用域,将即将包含的模板与脚本的业务逻辑外部世界隔离开来。从关联数组提取的变量extract()仅在render()中是局部的 - 整个模板只存在于该函数中。
请注意,extract()提取的变量是命名为第二个参数的关联索引。如果您的模板不需要不同的变量名称,则可以通过像这样初始化数组来减少一些行:
$export = compact('title','name','showdata','errors');

$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;
}

重要提示:对于这样的模板,如果您尝试访问全局数据、数据库连接、超级全局数组(如 $_SESSION、$_GET、$_POST、$_COOKIE、$_FILES、$_SERVER 等),则您没有正确使用此技术。您的目标是完全将逻辑与视图分离。
如果确实需要这些数据,则通过中介变量将其提供给视图,例如:
$export = array(
        'title' => $title,
        'name' => $name,
        'do_greet' => $showdata,
        'errors' => $errors,
        'referer' => htmlentities($_SERVER['HTTP_REFERER'])
);

这是视图或模板 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>

免责声明:所呈现的代码不够规范,也不安全或完美。我的意图只是为了让你走上正确的道路。做更多的研究是你的工作


框架

以上是模板引擎的部分。框架提供功能(以函数和/或类的形式)来解决常见问题,例如身份验证、授权、将请求路由到正确的文件/类(MVC世界中的控制器)等。

CMS不同的是,这些功能不能直接使用。框架的不同组件必须由程序员进行连接。因为程序员只需要进行这种连接,而不是为每个项目一遍又一遍地(重新)编写这些功能,所以框架使编程更加愉快,让程序员集中精力解决实际的项目特定问题。

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


我认为在PHP中模板引擎并非不必要,它们确实可以使布局编写更加容易,因为它们通常具有一些好用的辅助功能(在输出上运行htmlentities,提供循环计数器并为循环设置奇偶/第一个/最后一个变量等)。此外,有些网页设计师并不了解PHP,有时你被迫与他们合作。如果他们知道PHP,他们往往会以开发人员无法想象的方式滥用它。为他们提供模板引擎可以使开发人员的工作更轻松,因为您不必再检查他们的模板。 - user253984
1
我并没有说模板引擎是不必要的,我只是说一个程序员本身并不真正需要它。当然,这里有“网页设计师因素”在起作用。 - Flavius

4

框架比模板引擎更为复杂。框架可以包含模板引擎,但反之则不行。框架可以帮助您以无数种方式构建您的(Web)应用程序。模板引擎仅用于将变量解析到您预先格式化的HTML模板中。


0

像Zend Framework这样的框架本质上是在PHP之上的扩展,而Smarty是一个模板引擎,它只是将所有的PHP变量与前端(HTML)分离开来,同时支持简单的内容缓存方法。

我建议你开始学习Smarty,因为它很简单,你会惊讶于将前端设计与PHP代码结合起来会更加容易。

你也可以将Smarty与eAccelerator http://eaccelerator.net/ 结合使用,以加快速度。


5
为什么会被踩?解释你不同意的原因比简单地说“不”并离开要好。 - Christopher Altman
可能是因为“框架[...]本质上是在PHP之上的语言扩展”。检查一下你对“编程语言”的理解。 - Flavius

0

简而言之:

模板引擎 实际上只是稍微高级一点的 str_replace。它在模板中搜索特殊标记,并将其替换为相应的值。更高级的引擎(如Smarty)还具有循环和条件。

Web 框架(如Zend)完成网页的大部分核心工作,接受页面请求并将其转发给负责处理请求的处理程序,通常还会将响应信息转发给模板引擎以实现逻辑和布局的分离。 Web框架(还有其他类型的框架,例如GUI框架、网络框架、图形框架等)通常具有实用程序助手,可帮助您处理 typcial web site 需要的所有内容,例如表单验证、会话管理、验证码生成、URL重写等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接