9. 使用模板
模板提供了一种将控制器和域逻辑与表示逻辑分离的方便方法。模板通常包含应用程序的 HTML,但也可以用于其他格式,如 XML。模板通常被称为 “视图”,它构成了模型 - 视图 - 控制器 (MVC) 软件体系结构模式的第二个组件的一部分。
好处#
使用模板的主要好处是它们在表示逻辑和应用程序的其余部分之间创建了明确的分离。模板只负责显示格式化的内容。它们不负责数据查找、持久化或其他更复杂的任务。这将导致更清晰、更易读的代码,这对于开发人员处理服务器端代码 (控制器、模型) 和前端人员处理前端代码特别有帮助。
模板还可以改进代码结构。模板通常放在 “views” 文件夹中,每个模板都在一个文件中定义。这种方法鼓励代码重用,即将较大的代码块拆分成较小的、可重用的部分,通常称为分区。例如,可以将网站页眉和页脚分别定义为模板,然后在每个页面模板之前和之后分别包含模板。
最后,根据你使用的库,模板可以通过自动转义用户生成内容来提供更多的安全性。有些库甚至提供沙盒 (sand-boxing) ,模板设计者只能访问白名单中的变量和函数。
普通 PHP 模板#
普通 PHP 模板只是使用原生 PHP 代码的模板。它们是一个自然的选择,因为 PHP 实际上是一种模板语言本身。这意味着您可以在其他代码中组合 PHP 代码,比如 HTML。这对 PHP 开发人员是有益的,因为没有新的语法需要学习,他们知道可用的函数,他们的代码编辑器已经有了 PHP 语法突显和自动完成内置。此外,普通 PHP 模板往往非常快,因为不需要编译阶段。
现代 PHP 框架都会使用某种模板系统,其中大多数使用原生的 PHP 语法。在框架之外,像 Plates 或 Aura.View 这些类库提供了继承、布局和扩展等现代模板功能,使原生 PHP 模板变得更易用。
原生 PHP 模板简单示例#
使用 Plates 类库
<?php // user_profile.php ?>
<?php $this->insert('header', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>
<?php $this->insert('footer') ?>
原生 PHP 模板使用继承的示例#
使用 Plates 类库
<?php // template.php ?>
<html>
<head>
<title><?=$title?></title>
</head>
<body>
<main>
<?=$this->section('content')?>
</main>
</body>
</html>
<?php // user_profile.php ?>
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->escape($name)?></p>
编译模板#
尽管 PHP 已经发展成为一种成熟的面向对象语言,但它作为模板语言 没有太大改进。编译模板,如 Twig,Brainy,或 Smarty【注】,提供了模板专用的新语法填补这一空白。从自动转义到继承以及简化的控制结构,编译模板设计为更易于编写、更清晰易读和使用更安全。编译模板甚至可以跨不同语言共享,Mustache 就是一个很好的例子。由于这些模板必须编译,因此会对性能造成轻微的影响,但是在适当地使用缓存后影响就非常小了。
【注】:虽然 Smarty 提供了自动转义功能,不过默认情况下是关闭的
编译模板简单示例#
使用 Twig 类库。
{% include 'header.html' with {'title': 'User Profile'} %}
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
{% include 'footer.html' %}
使用继承的编译模板示例#
使用 Twig 类库。
// template.html
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>
// user_profile.html
{% extends "template.html" %}
{% block title %}User Profile{% endblock %}
{% block content %}
<h1>User Profile</h1>
<p>Hello, {{ name }}</p>
{% endblock %}
延伸阅读#
文章与教程#
类库#
- Aura.View (原生)
- Blade (编译,特定框架)
- Brainy (编译)
- Dwoo (编译)
- Latte (编译)
- Mustache (编译)
- PHPTAL (编译)
- Plates (原生)
- Smarty (编译)
- Twig (编译)
- Zend\View (原生,特定框架)
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: