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

时间:2010-06-29 10:50:12

标签: php frameworks template-engine

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

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

4 个答案:

答案 0 :(得分:6)

Template engines可以让网页设计师的生活更轻松。 Frameworks适用于程序员。

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

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

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

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

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

你可能已经听说过MVC - 或者没有 - 这没关系。下面介绍的做法与此类似,但您无需编程OOP或使用framework

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

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

函数render()做了一件重要的事情:它通过使用自动变量范围 - 变量extract()来编译,从而将要包含的模板与我们脚本的业务逻辑的外部世界隔离开来。关联数组是render()的局部数据 - 整个模板只存在于该函数中。

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

$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术语表示)。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

我建议你开始学习Smarty的简单性,你会惊讶地发现将前端设计与PHP代码结合起来要容易得多。

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

答案 3 :(得分:-1)

简而言之:

模板引擎只会提供更高级的str_replace。它在模板中搜索特殊标签,并用相应的值替换它们。更高级的引擎(如Smarty)也有循环和条件。

Web框架(如Zend)执行网页的大部分核心内容,接收页面请求并将其转发给负责处理请求的处理程序,并且通常还会将响应信息转发给用于分离逻辑和布局的模板引擎。 Web框架(还有其他框架类型,即GUI框架,网络框架,图形框架等)通常都有实用程序帮助程序,可以帮助您处理典型网站所需的一切,表单验证,会话管理,Captcha生成,URL重写等。 ..