特性
Smarty 的一些特性:
- 它非常快。
- 它是高效的,因为 PHP 解析器做了繁重的工作。
- 没有模板解析开销,只编译一次。
- 它对重新编译只有改变的模板文件非常聪明。
- 你可以轻松创建自己的自定义函数和变量修饰符,所以模板语言极其可扩展。
- 可配置的模板{delimiter}标签语法,所以你可以使用
{$foo},{{$foo}},<!--{$foo}-->等。 {if}..{elseif}..{else}..{/if}结构被传递给 PHP 解析器,所以{if...}表达式语法可以根据你的喜好进行简单或复杂的评估。- 允许无限嵌套
sections、if's等。 - 内置caching支持
- 任意模板源
- 模板继承以便于模板内容的管理。
- 插件架构
将展示层从应用代码中分离
- 这意味着模板可以包含逻辑,但条件是它只用于展示。例如包含其他模板、交替表格行颜色、大写一个变量、循环遍历数据数组并渲染它们是展示逻辑的例子。
- 但这并不意味着 Smarty 强制将业务逻辑和展示逻辑分离。Smarty 并不知道哪些是业务逻辑,哪些是展示逻辑,所以在模板中放置业务逻辑是你自己的行为。
- 另外,如果你希望你的模板不包含逻辑,你完全可以通过将内容简化为纯文本和变量来实现。
它是如何工作的?
在底层,Smarty 将模板"编译"(基本上是复制和转换)成 PHP 脚本。这在每个模板首次调用时发生一次,然后从那时起使用编译后的版本。Smarty 为你处理这些,所以模板设计者只需要编辑 Smarty 模板,而不必管理编译后的版本。这种方法使模板易于维护,同时由于编译后的代码就是 PHP,所以执行时间非常快。当然,所有 PHP 脚本都可以利用 PHP 操作码缓存,如 APC。
模板继承
模板继承在 Smarty 3 中引入。在模板继承之前,我们将模板管理为头部和底部模板等片段。这种组织方式导致了许多问题,需要一些技巧来解决,例如在每一页的头部/底部管理内容。有了模板继承,我们不再包含其他模板,而是将我们的模板维护为单个页面。然后,我们可以通过继承它们来操作内容块。这使得模板直观、高效且易于管理。更多信息请参见模板继承。
为什么不使用 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 不是 Laravel、Symfony、CodeIgniter 或任何其他 PHP 应用开发框架的替代品。
Smarty 是一个模板引擎,作为你的应用程序的(V)iew 组件。Smarty 可以轻松地与上述任何引擎配合使用作为视图组件。与任何其他软件一样,Smarty 有一个学习曲线。Smarty 并不能保证良好的应用设计或适当的展示分离,这仍需要由一个有能力的开发者和网页设计师来解决。
Smarty 适合我吗?
Smarty 并不是适合所有工作的工具。重要的是确定 Smarty 是否符合你的需求。你需要问自己一些重要的问题:
模板语法
你是否满意 PHP 标签与 HTML 混合?你的网页设计师是否熟悉 PHP?你的网页设计师是否更喜欢为展示设计的基于标签的语法?有一些与 Smarty 和 PHP 都有经验的工作可以帮助回答这些问题。
商业案例
是否有需求将模板与 PHP 隔离?你是否有不信任的第三方编辑模板,你不希望给他们释放 PHP 的全部能力?你是否需要以程序化的方式控制模板中的可用和不可用内容?Smarty 设计上提供了这些能力。
功能集
Smarty 的功能,如缓存、模板继承和插件架构,是否可以节省编写其他必要代码的开发周期?你计划使用的代码库或框架是否有你需要的展示组件的功能?
使用 Smarty 的网站
许多知名的 PHP 项目都使用 Smarty,如 XOOPS CMS、CMS Made Simple、Tiki CMS/Groupware 和 X-Cart 等。
总结
无论你是为小型网站还是大型企业解决方案使用 Smarty,它都可以满足你的需求。有许多功能使 Smarty 成为一个很好的选择:
- PHP 与 HTML/CSS 的分离就是有道理的
- 可读性有助于组织和管理
- 对第三方模板访问的安全性
- 功能完整,且易于扩展以满足你自己的需求
- 庞大的用户基础,Smarty 会一直存在
- LGPL 许可证用于商业使用
- 100%免费使用,开源项目