什么是 Smarty?
为什么要使用它?
用例和工作流程
语法比较
模板继承
最佳实践
速成教程
Smarty 是用于 PHP 的模板引擎,有助于将展示(HTML/CSS)从应用逻辑中分离出来。这意味着PHP 代码就是应用逻辑,并且与展示分离。
Smarty 设计很大程度上受到这些目标的推动
在 PHP 模板方面,基本上有两派思想。第一派声称“PHP 就是一个模板引擎”。这一方法简单地将 PHP 代码与 HTML 混合。虽然从纯脚本执行的角度来看,这种方法速度很快,但许多人认为,当 PHP 语法与展示混合时,就会变得混乱且难以维护。PHP 非常适合用于编程,但不太适合用于模板。
第二派声称,展示应避免任何编程代码,而应使用简单的标签来指示应用内容的显示位置。这一方法常见于其他模板引擎(和其他编程语言),也是 Smarty 所采用的方法。其理念是让模板完全专注于展示,不包含应用代码,并且尽可能少地增加开销。
将 PHP 代码与模板分离有很多好处,其中包括:
<?php echo strtolower(htmlspecialchars($title,ENT_QUOTES,UTF-8)); ?>
{$title|escape|lower}Smarty 和 PHP 之间存在着抽象层,两者很不一样,Smarty 是通过 PHP 来简化模板维护的一个抽象层。
有关 PHP 与 Smarty 语法比较的信息,请参见 语法比较。
一个常见问题:“Web 设计师反正都需要学习一种语法,为什么不学习 PHP?”当然,Web 设计师可以学习 PHP,并且他们可能已经熟悉该语言。问题不在于他们学习 PHP 的能力,而在于维护将 PHP 与 HTML 混合使用的代码。{tags} 比 PHP 语句更简单、更直观,而且更坚固。模板还会限制可以放入模板的内容。使用 PHP 时,可以很容易地在不属于该位置的模板中添加代码。虽然你可以让设计师掌握应用程序设计规则,但其实没有必要这样做(现在,他们已经是开发人员了!)。PHP 手册是编写给开发人员的。设计师只需要了解该手册的一小部分内容,并且手册并不能帮助他们更轻松地找到所需的知识。Smarty 为 Web 设计师提供他们所需的工具,并且让开发人员能够仔细控制这些工具。还提供多种展示功能,如模板继承,这能够最大程度地提高模板的重用率,同时简化组织。
虽然 Smarty 提供了将展示从应用程序代码中彻底分离的工具,但是它也提供了很多打破这些规则的空间。实现不当(例如,在模板中注入 PHP),将导致比展示分离本来要解决的问题更多。该文档很好地指出了需要预防的事情。另外,还可以参见 最佳做法 部分。
速成教程 部分很好地概述了通常如何将 Smarty 实施到 PHP 应用程序中。
在幕后,Smarty 会将模板的副本编译成 PHP 脚本。这样,您可以同时获得模板标记语法的优势和 PHP 的速度。编译发生在首次调用每个模板时,然后会从此点开始使用编译版本。Smarty 会为您执行此操作,所以模板设计人员只需编辑 Smarty 模板,而无需管理已编译版本。此方法令模板易于维护并令执行时间保持极快。由于已编译版本是 PHP,APC 或 ZendCache 等 op 代码加速器将继续对已编译脚本发挥作用。
模板继承是 Smarty 3 的新功能,也是众多出色新功能之一。在模板继承之前,我们将模板分段管理,例如页眉和页脚模板。这种组织方式会带来很多需要费一番周折才能解决的问题,例如按页面方式管理页眉/页脚中的内容。使用模板继承时,我们会将模板保留为单个页面,而不再包含其他模板。然后,我们可以通过继承在模板中操作内容块。这使得模板直观、高效且易于管理。有关更多信息,请参见 模板继承。
有两个很好的理由。首先,Smarty 不仅仅可用于基于 XML/HTML 的模板,例如生成电子邮件、javascript、CSV 和 PDF 文档。其次,XML/XSLT 语法比 PHP 代码更冗长且更脆弱!它非常适合计算机,但对人类来说却很糟糕。Smarty 的目标是易于阅读、理解和维护。
虽然 Smarty 可以保护您不受 PHP 侵害,但您仍可以选择在某些情况下使用它。模板安全性强制限制 PHP(和选择 Smarty 函数)。如果您有第三方编辑模板,并且不想向他们开放 PHP 或 Smarty 的全部功能,这将非常有用。
Smarty 并不是唯一遵循“分离编程代码与展示”理念的引擎。例如,Python 拥有围绕相同原理构建的模板引擎,如 Django 模板 和 CheetahTemplate。注意:Python 等语言不会与 HTML 本机混合,这给了它们从一开始就正确分离编程代码的优势。虽然有可用于将 Python 与 HTML 混合的库,但通常不会采用它们。
Smarty 不是应用程序开发框架。Smarty 不是 MVC。Smarty 不是 Zend Framework、CodeIgniter、CakePHP 或任何其他适用于 PHP 的应用程序开发框架的替代方案。
Smarty 是一款模板引擎,用作应用程序的(V)视图组件。Smarty 可以轻松地与上面作为视图组件列出的任何引擎相耦合。与任何其他软件一样,Smarty 也有一个学习曲线。Smarty 不能保证良好的应用程序设计或良好的表现分离,这仍然需要一个合格的开发者和网页设计师来解决。
Smarty 并不能作为每一项工作的工具。重要的是确定 Smarty 是否符合你的需求。有一些重要问题需要自问
模板语法。你是否满意将 PHP 标签与 HTML 混合使用?你的网页设计师是否熟悉 PHP?你的网页设计师是否更喜欢为表现而设计的基于标签的语法?同时使用 Smarty 和 PHP 的一些经验有助于回答这些问题。
业务案例:是否有必要隔离 PHP 的模板?是否有不信任方编辑你不想释放 PHP 功能的模板?是否需要以编程方式控制模板里允许和不允许的内容?Smarty 按照设计提供了这些功能。
特色集:Smarty 的功能,例如缓存、模板继承和插件架构,是否能够节省编写代码的开发周期,否则就需要这些代码?你计划使用的代码库或框架是否具有表现组件所需的功能?
另请参阅 Smarty 网站上的关于 使用案例和工作流 的部分。
每天有数万名独立访问者访问 Smarty 网站,其中大多数是阅读文档的开发者。许多著名的 PHP 项目都使用 Smarty,例如 XOOPS CMS、CMS Made Simple 和 Tiki CMS/Groupware,仅举几例。
无论你将 Smarty 用于小型网站还是大型企业解决方案,它都可以满足你的需求。Smarty 拥有众多功能,使其成为一个不错的选择