什么是 Smarty?
为什么使用它?
用例和工作流
语法比较
模板继承
最佳实践
速成课程
设计理念
Smarty 的设计很大程度上受到以下目标的推动
将显示与应用程序代码完全分离
使用 PHP 后端、Smarty 模板前端
作为 PHP 的补充,而不是替代 PHP
为程序员和设计人员提供快速开发/部署
快速且易于维护
语法易懂,无需 PHP 知识
自定义开发的灵活性
安全性:与 PHP 隔离
免费、开源
什么是 Smarty?
Smarty 是一个用于 PHP 的模板引擎,它促进了显示(HTML/CSS)与应用逻辑的分离。这意味着PHP 代码就是应用逻辑,并且与显示分离。
两大阵营
在 PHP 中使用模板时,基本上分为两大阵营。第一阵营宣称“PHP 是一个模板引擎”。这种方法只是将 PHP 代码与 HTML 相混合。尽管从纯脚本执行的角度来看,这种方法最快,但许多人会认为,当 PHP 语法与 HTML 等标记化标记混合后会显得凌乱且复杂。
第二阵营宣称,显示内容应该没有任何编程代码,而是使用简单的标签来指示显示应用内容的位置。这种方法在其他模板引擎(甚至在其他编程语言中)中很常见,也是 Smarty 所采取的方法。其理念是将模板集中在显示上,不包含应用代码,并且尽可能减少开销。
将 PHP 与模板分离开来为什么重要?
两个主要优势
语法:模板通常由 HTML 等语义标记组成。PHP 语法适用于应用代码,但在与 HTML 混合时会急剧恶化。Smarty 的简单 {tag} 语法专门设计用于表示显示。Smarty 让模板专注于显示,而不是“代码”。这有助于更快速地部署模板并简化维护。Smarty 语法不要求对 PHP 有实际了解,它对于程序员和非程序员来说都很直观。
隔离:当 PHP 与模板混合时,可以将任何类型的逻辑注入到模板中,不受限制。Smarty 将模板与 PHP 隔离,从而控制性地将展示逻辑与业务逻辑分离。Smarty 还有可进一步强化对模板限制的安全特性。
Web 设计师与 PHP
一个常见问题:“Web 设计师反正也要学习语法,为什么不学 PHP?”当然,Web 设计师可以学习 PHP,而且他们可能已经熟悉它。问题不在于他们学习 PHP 的能力,而在于将 PHP 与 HTML 混合的后果。如果设计师使用 PHP,那么很容易在模板中添加不属于模板的代码(当他们只想要一把刀时,你却给了他们一把瑞士军刀。)你可以教他们应用程序设计的规则,但这可能不是他们真正需要学习的内容(现在他们会变成开发者了!)PHP 手册也是一堆庞杂的信息,需要仔细阅读。这就好比给汽车所有者一本工厂装配手册,而他们只需要一本用户手册。Smarty 为 Web 设计师提供了他们所需的工具,并提供了对这些工具的细粒度控制。基于标记的简洁语法对设计师来说也很受欢迎,它帮助他们简化了模板的组织和管理。
实现很重要
虽然 Smarty 为你提供了将展示逻辑与应用程序代码明确分开的工具,但它也为你提供了大量弯曲这些规则的空间。一个糟糕的实现(例如:在模板中注入 PHP)将造成更多的问题,而展示分离本意是想解决这些问题的。文档中详细指出了在哪些方面需要注意。还请参见 Smarty 网站的最佳实践部分。
它是如何运作的?
在底层,Smarty “编译”(基本上是拷贝并转换)将模板编译成 PHP 脚本。当首次调用每个模板时发生一次,然后从那时开始使用编译过的版本。Smarty 会为你处理此操作,因此模板设计师只需编辑 Smarty 模板,而无需管理已编译版本。这种方法可保持模板易于维护,且由于已编译代码只是 PHP,因此可以极大地缩短执行时间。当然,所有 PHP 脚本都利用了 PHP 操作码缓存,例如 APC。
模板继承
模板继承是 Smarty 3 中的新特性,它也是许多 tuyệt vời的新特性之一。在模板继承之前,我们是按部分(如页眉和页脚模板)管理模板的。这种组织方式会产生许多问题,需要一些额外的步骤,例如逐个页面管理页眉/页脚中的内容。借助模板继承,我们不必包含其他模板,而是将模板作为单个页面进行维护。然后,我们可以通过继承在其中操作内容块。这使得模板直观、高效且易于管理。请参阅 Smarty 网站的“模板继承”部分了解更多信息。
为什么不使用 XML/XSLT 语法?
有几个很好的理由。首先,Smarty 不仅可以用于基于 XML/HTML 的模板,还可以用于生成电子邮件、JavaScript、CSV 和 PDF 文档。其次,XML/XSLT 语法比 PHP 代码更加冗长且脆弱!它非常适合计算机,但对于人类来说却很糟糕。Smarty 的目的是易于阅读、理解和维护。
模板安全性
虽然 Smarty 使您与 PHP 隔离,但如果您愿意,仍然可以选择以特定方式使用它。模板安全性强制限制 PHP(和选择 Smarty 函数)。如果您有第三方编辑模板,并且不希望向他们泄露 PHP 或 Smarty 的全部功能,这是很有用的。
整合
Smarty 有时会被拿来与模型-视图-控制器 (MVC) 框架进行比较。Smarty 不是 MVC,它只是表示层,就像 MVC 的视图 (V) 部分一样。事实上,Smarty 可以轻松集成作为 MVC 的视图层。许多流行功能都有用于 Smarty 的集成说明,或者您可以在论坛和文档中找到一些帮助。
其他模板引擎
Smarty 并不是唯一遵循 “将编程代码与表示分离”理念的引擎。例如,Python 有围绕相同原理构建的模板引擎,如 Django Templates 和 CheetahTemplate。 注意:Python 等语言不会与 HTML 本机混合,这给了它们从一开始就能合理分离编程代码的优势。有一些库可用于将 Python 与 HTML 混合,但它们通常不被使用。
Smarty 是什么
Smarty 不是应用程序开发框架。Smarty 不是 MVC。Smarty 不是 Zend Framework、CodeIgniter、PHPCake 或任何其他用于 PHP 的应用程序开发框架的替代品。
Smarty 是一个模板引擎,用作应用程序的(V)iew 组件。Smarty 可以轻松地耦合到上面列出的任何引擎作为视图组件。与任何其他软件一样,Smarty 有一个学习曲线。Smarty 不保证良好的应用程序设计或表示的适当分离,这仍然需要由一位称职的开发人员和 Web 设计师来解决。
Smarty 适用于我吗?
Smarty 并非旨在成为每项工作的工具。重要的是要确定 Smarty 是否符合您的需求。有一些重要的问题需要您自问
模板语法。您是否满足于与 HTML 混合的 PHP 标记?您的 Web 设计师是否熟悉 PHP?您的 Web 设计师是否更喜欢为表示设计的基于标记的语法?有一些同时使用 Smarty 和 PHP 的经验有助于回答这些问题。
业务案例:是否需要将模板与 PHP 隔离?您是否有不受信任方编辑模板,而您不希望对其释放 PHP 的强大功能?您是否需要以编程方式控制模板中可用和不可用的内容?Smarty 专门提供这些功能。
功能集:Smarty 的功能,例如缓存、模板继承和插件架构是否节省了编写代码的开发周期,而这些代码在其他情况下是必需的?您计划使用的代码库或框架是否具有演示组件所需的特性?
PHP 中的模板化是一个热门话题,并且观点广为不同。重要的是,您了解 Smarty,了解您自己的需求,并为自己做出明智的决策。欢迎您在论坛或 IRC 频道中提出具体问题。
另请参阅 Smarty 网站上的“用例和工作流程”部分。
使用 Smarty 的网站
每天都有数万名独立访客访问 Smarty 网站,他们大多是阅读文档的开发人员。许多著名的 PHP 项目都使用 Smarty,例如 XOOPS CMS、CMS Made Simple、Tiki CMS/Groupware 和 X-Cart 等。
总结
无论您是将 Smarty 用于小型网站还是大型企业解决方案,它都可以满足您的需求。Smarty 具有诸多特性,使其成为绝佳的选择
将 PHP 与 HTML/CSS 分离是有意义的
可读性适用于组织和管理
安全性适用于第三方模板访问
特性完整且易于扩展以满足您自己的需求
庞大的用户群,Smarty 会一直存在
LGPL 商业用途许可证
100% 免费使用,开源项目