学完这篇你能得到一张明确的选型表:什么项目用 Smarty、什么项目用 Twig、什么项目直接用 Blade,以及每种引擎最少需要哪几行配置代码。
第一步 先破一个误区:三者都是"编译成 PHP"的
很多人以为模板引擎是"解释执行",所以慢。实际上 Smarty、Twig、Blade 都是把模板文件编译成原生 PHP 代码,存到缓存目录,下次直接 include 编译结果。真正影响性能的不是"用哪个引擎",而是"缓存有没有开"。
所以选型时不用纠结性能,纠结的是:语法习惯、生态绑定、安全默认值、独立使用成本。
注意:如果哪天你发现"用了模板引擎网站变慢",90% 是编译缓存目录不可写或缓存开关没打开,不是引擎本身的问题。
第二步 三者独立安装,各跑一个最小例子
都用 Composer 装(Clara BBS 这类无框架系统本身不需要 Composer,也不用模板引擎,这里是说独立项目里用):
# Twig
composer require twig/twig
# Smarty
composer require smarty/smarty
# Blade(Laravel 的视图组件)
composer require illuminate/view illuminate/container illuminate/filesystem illuminate/events
最小初始化:
// Twig
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader, ['cache' => 'cache/twig']);
// Smarty
$smarty = new Smarty();
$smarty->setTemplateDir('templates');
$smarty->setCompileDir('cache/smarty_compile');
// Blade(独立使用,社区封装包 jenssegers/blade 更省事)
$blade = new \Jenssegers\Blade\Blade('templates', 'cache/blade');
入口位置很关键:templates 放模板源文件,cache/* 放编译产物,后者必须给 PHP 写权限。
第三步 同一个页面写三遍,语法差异一眼看清
显示"用户名 + 文章列表 + 转义输出":
{# Twig #}
<h1>{{ user.name }}</h1>
{% for post in posts %}
<a href="/p/{{ post.id }}">{{ post.title }}</a>
{% endfor %}
{* Smarty *}
<h1>{$user.name|escape}</h1>
{foreach $posts as $post}
<a href="/p/{$post.id}">{$post.title|escape}</a>
{/foreach}
{{-- Blade --}}
<h1>{{ $user->name }}</h1>
@foreach ($posts as $post)
<a href="/p/{{ $post->id }}">{{ $post->title }}</a>
@endforeach
三者的取舍从这里就能看出来:
- Twig 用
{% %} 包围逻辑,{{ }} 输出,和 HTML 混排最不刺眼;
- Smarty 用
{if} {foreach} 自定义标签,老项目里最常见;
- Blade 的
@if @foreach 纯 Laravel 风格,写起来最快,但离开 Laravel 生态就是"外来的"。
第四步 安全性对比:默认转义是分水岭
这是最容易被忽略、后果最严重的一项。
- Twig:
autoescape 默认开启,{{ }} 自动 HTML 转义,要输出原始 HTML 必须显式写 |raw——漏写会报错而不是静默输出。
- Blade:
{{ }} 自动转义,{!! !!} 不转义。默认安全,但两个符号容易混。
- Smarty:默认不自动转义,需要每个变量手动加
|escape,或统一设置默认修饰器。老项目里大量 {$var} 直接输出,是 XSS 重灾区。
注意:无论用哪个引擎,表单都别忘了 CSRF 令牌——模板引擎不会替你生成 token,得自己在模板里输出隐藏字段并在后端校验。Clara BBS 这类系统是把 CSRF 做进了内核,用第三方引擎时得自己补。
第五步 配置里的两个必改项
// Twig:生产环境一定要开 cache,改模板后手动清缓存
new \Twig\Environment($loader, ['cache' => 'cache/twig', 'auto_reload' => false]);
// Smarty:关掉每次请求都检查模板改动,否则白白 stat 一堆文件
$smarty->compile_check = false;
$smarty->caching = false;
Blade 在 Laravel 里用 php artisan view:cache 预编译,改模板后 php artisan view:clear;独立使用时确认编译目录可写即可。
注意:Smarty 的编译目录在换服务器、改域名后建议整个删掉重建,残留的旧编译文件可能导致莫名其妙的白屏。
第六步 按项目类型拍板
| 你的情况 | 选它 | 原因 |
|---|
| 用 Laravel | Blade | 框架自带,零成本,别引入第二个引擎 |
| 用 Symfony / 独立轻量项目 | Twig | 无强依赖,默认安全,文档最规范 |
| 维护 2015 年前的老站 | Smarty | 语法不改动最小,重写风险高 |
| 无框架的小系统(如 Clara BBS 这类单文件上传、保存即生效的结构) | 不用引擎 | 原生 PHP 模板 + htmlspecialchars 反而最省,少一层编译目录要维护 |
一句话总结:**新项目优先 Twig,Laravel 项目用 Blade,历史项目留 Smarty,轻量无框架系统不必强上模板引擎。**
小结
- 三者都是编译成 PHP + 缓存,性能差别在缓存开关,不在引擎。
- Twig 默认自动转义、独立使用成本最低;Blade 绑 Laravel 最舒服;Smarty 适合老项目。
- 必查三件事:编译缓存目录可写、生产环境开启 cache、输出用户内容时确认转义。
- 模板引擎不负责 CSRF 和表单令牌,这部分要自己实现。
- 轻量无框架系统的原生 PHP 模板依然是完全合理的选择。