目录
- 什么是 Smarty?
- 安装 Smarty
- 基本配置与目录结构
- 核心配置文件 (
config.php) - 模板语法基础
- 最佳实践与高级配置
- 完整示例
什么是 Smarty?
Smarty 是一个成熟、稳定且功能强大的 PHP 模板引擎,它的核心思想是 “关注点分离”(Separation of Concerns)。

- PHP 文件 (后端逻辑):负责处理业务逻辑、数据库交互、数据计算等。
- Smarty 模板文件 (前端展示):只负责展示数据,使用简单的模板语法,让前端开发者(不熟悉 PHP 的人)也能轻松修改页面布局和样式。
这样做的好处:
- 代码清晰:逻辑和视图分离,代码更易读、易维护。
- 协作方便:PHP 开发者和前端开发者可以并行工作。
- 安全性:模板变量默认会被转义,有效防止 XSS 跨站脚本攻击。
- 性能:Smarty 可以对模板进行编译和缓存,提升页面加载速度。
安装 Smarty
最推荐的方式是使用 Composer 来安装 Smarty,因为它能自动处理依赖关系,并让项目更易于管理。
如果你的项目还没有 composer.json 文件,先在项目根目录下运行:
composer init
安装 Smarty:

composer require smarty/smarty
安装完成后,你的 vendor 目录下就会有 smarty 文件夹。
基本配置与目录结构
Smarty 需要几个特定的目录来存放不同类型的文件,一个标准的、推荐的目录结构如下:
/my_project/
├── app/ # 应用主目录
│ ├── controllers/ # 控制器
│ ├── models/ # 模型
│ └── views/ # 视图目录 (存放 Smarty 模板)
│ └── templates/ # 模板文件 (.tpl)
│ └── templates_c/ # 模板编译文件 (Smarty 自动生成)
│ └── configs/ # 配置文件 (.conf, .config)
│ └── cache/ # 缓存文件 (Smarty 自动生成)
├── vendor/ # Composer 依赖
├── index.php # 入口文件
└── composer.json
关键目录说明:
templates/:存放你的.tpl模板文件,这是你需要编写 HTML 和 Smarty 语法的地方。templates_c/:Smarty 编译模板后生成的 PHP 文件。这个目录必须可写,权限通常是755或777(开发环境)。configs/:存放全局配置文件,可以在模板中加载。cache/:存放 Smarty 生成的缓存文件,如果需要开启缓存,这个目录也必须可写。
核心配置文件 (config.php)
在项目的 app 目录下创建一个 config.php 文件,用于初始化 Smarty 并进行基本配置。

app/config.php
<?php
// 引入 Composer 自动加载器
require_once __DIR__ . '/../vendor/autoload.php';
// 使用 Composer 的自动加载来加载 Smarty 类
use Smarty;
// 创建 Smarty 实例
$smarty = new Smarty();
// --- 1. 设置目录路径 ---
// 模板文件所在目录
$smarty->setTemplateDir(__DIR__ . '/views/templates/');
// 编译文件目录
$smarty->setCompileDir(__DIR__ . '/views/templates_c/');
// 配置文件目录
$smarty->setConfigDir(__DIR__ . '/views/configs/');
// 缓存文件目录
$smarty->setCacheDir(__DIR__ . '/views/cache/');
// --- 2. 基本配置选项 ---
// 关闭模板缓存(开发时建议关闭)
$smarty->caching = Smarty::CACHING_OFF;
// 设置缓存生命周期(单位:秒),仅在开启缓存时有效
$smarty->cache_lifetime = 3600;
// 关闭安全模式(默认关闭,除非有特殊需求)
$smarty->security = false;
// 左右定界符,避免与 JavaScript 冲突
$smarty->left_delimiter = '{#';
$smarty->right_delimiter = '#}';
// --- 3. 开发辅助配置 ---
// 开启调试控制台(非常有用!)
$smarty->debugging = true;
// 将所有输出变量进行 HTML 自动转义,防止 XSS 攻击(强烈推荐开启)
$smarty->escape_html = true;
// 返回配置好的 Smarty 对象
return $smarty;
配置说明:
setTemplateDir(): 必须设置,告诉 Smarty 去哪里找模板文件。setCompileDir(): 必须设置,并且确保该目录有写入权限。caching = Smarty::CACHING_OFF: 在开发阶段,关闭缓存可以让你立即看到模板修改后的效果。left_delimiter和right_delimiter: 默认是 和 ,如果你的模板里有大量的 JavaScript 代码(如 ),为了不产生冲突,可以修改成其他符号,如 和 或 和 。escape_html = true: 非常重要的安全设置,开启后,所有从 PHP 传递到模板的变量在输出时都会自动进行htmlspecialchars()转义,可以有效防止 XSS 攻击。
模板语法基础
假设你有一个控制器文件,它负责准备数据并渲染模板。
app/controllers/HomeController.php
<?php
// 引入 Smarty 配置
$smarty = require_once __DIR__ . '/../config.php';
// 1. 准备数据
$userName = "张三";
$products = [
['id' => 1, 'name' => '笔记本电脑', 'price' => 5999],
['id' => 2, 'name' => '智能手机', 'price' => 3999],
['id' => 3, 'name' => '无线耳机', 'price' => 899]
];
// 2. 分配变量到模板
// 单个变量
$smarty->assign('pageTitle', '欢迎来到我的商城');
$smarty->assign('user', $userName);
$smarty->assign('productList', $products);
// 3. 显示模板
// Smarty 会去 'templates_dir' 目录下寻找 'index.tpl' 文件
$smarty->display('index.tpl');
app/views/templates/index.tpl
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{#$pageTitle#}</title> <!-- 使用变量 -->
</head>
<body>
<h1>你好, {#$user#}!</h1> <!-- 使用变量 -->
<h2>商品列表</h2>
<ul>
{foreach $productList as $product} <!-- foreach 循环 -->
<li>
ID: {#$product.id#} -
名称: {#$product.name#} -
价格: ¥{#$product.price#}
</li>
{/foreach}
</ul>
{if $user == "张三"} <!-- if 条件判断 -->
<p>张三,欢迎回来!</p>
{else}
<p>欢迎新访客!</p>
{/if}
</body>
</html>
常用模板语法:
| 功能 | 语法 | 示例 |
|---|---|---|
| 变量输出 | {$variable} |
{$name} |
| 数组/对象属性 | {$array.key} 或 {$object->property} |
{$user.name} |
| 循环 | {foreach $array as $item}{foreachelse}{/foreach} |
见上例 |
| 条件判断 | {if condition}{elseif condition}{else}{/if} |
见上例 |
| 包含子模板 | {include file='header.tpl'} |
{include file='header.tpl' title='我的页面'} |
| 注释 | {* 这是 Smarty 注释,不会输出到 HTML *} |
{* 这是一个注释 *} |
最佳实践与高级配置
使用模板继承 (Template Inheritance)
这是 Smarty 3.x 最重要的特性之一,可以创建一个基础模板(base.tpl),其他模板继承它并覆盖特定区块,避免重复编写页头、页脚等。
app/views/templates/base.tpl
{extends 'layout/main.tpl'} <!-- 继承主布局模板 -->
{block 'head'}{#$pageTitle#} - 我的网站</title>
{parent} <!-- 可选:保留父模板中的 'head' 区块内容 -->
{/block}
{block 'content'}
{** 默认内容,如果子模板不覆盖则显示这个 **}
<p>这是默认内容区域。</p>
{/block}
{block 'footer'}
<p>这是由首页自定义的页脚内容。</p>
{parent} <!-- 在父模板页脚内容后面追加 -->
{/block}
app/views/templates/layout/main.tpl (主布局)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{block 'head'}默认标题{/block}</title>
</head>
<body>
<header>
<h1>网站头部</h1>
</header>
<main>
{block 'content'}{/block} <!-- 子模板将填充这里 -->
</main>
<footer>
{block 'footer'}默认页脚{/block} <!-- 子模板将覆盖或追加这里 -->
</footer>
</body>
</html>
使用配置文件
可以在 configs/ 目录下创建配置文件,在模板中加载,方便管理全局变量。
app/views/configs/site.conf
# 网站信息 site_name = "我的Smarty商城" site_url = "http://www.example.com"
在模板中加载并使用:
{config_load file='site.conf'}
<h1>{#$site_name#}</h1>
<p>我们的网址是: {#$site_url#}</p>
开启生产环境缓存
当你的网站上线后,为了提升性能,应该开启缓存。
在 config.php 中修改:
// --- 2. 基本配置选项 --- // 开启模板缓存 $smarty->caching = Smarty::CACHING_LIFETIME_CURRENT; // 缓存基于生命周期 // 设置缓存生命周期(单位:秒),例如缓存1小时 $smarty->cache_lifetime = 3600;
如何为不同用户生成不同缓存?
可以使用 cache_id,根据用户ID缓存:
$smarty->display('index.tpl', "user_{$userId}");
这样,ID为1的用户和ID为2的用户会看到各自的缓存版本。
完整示例
项目结构:
/smarty_project/
├── app/
│ ├── config.php
│ └── controllers/
│ └── index.php
├── vendor/
├── index.php
└── composer.json
index.php (项目入口)
<?php // 简单的路由,将请求转发给控制器 require_once 'app/controllers/index.php';
app/controllers/index.php
<?php
// 引入 Smarty 配置
$smarty = require_once __DIR__ . '/../config.php';
// 准备数据
$title = "Smarty 配置示例";
$articles = [
['title' => 'Smarty 入门教程', 'author' => '李四'],
['title' => 'PHP 最佳实践', 'author' => '王五']
];
// 分配变量
$smarty->assign('page_title', $title);
$smarty->assign('articles', $articles);
// 显示模板
$smarty->display('home.tpl');
app/views/templates/home.tpl
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">{#$page_title#}</title>
</head>
<body>
<h1>{#$page_title#}</h1>
<ul>
{foreach $articles as $article}
<li>
<strong>{#$article.title#}</strong> - 作者: {#$article.author#}
</li>
{/foreach}
</ul>
{* 调试控制台开关,在URL后加 ?SMARTY_DEBUG=1 即可查看 *}
{if isset($smarty.request.SMARTY_DEBUG)}
{debug}
{/if}
</body>
</html>
访问你的项目根目录 index.php,就能看到一个由 Smarty 渲染的页面了,如果开启了调试模式,在页面底部会有一个“Smarty Console”的浮动按钮,点击可以查看所有分配的变量,非常方便。
希望这份详细的指南能帮助你顺利地在 PHP 项目中配置和使用 Smarty!
