目录

  1. 什么是 Smarty?
  2. 安装 Smarty
  3. 基本配置与目录结构
  4. 核心配置文件 (config.php)
  5. 模板语法基础
  6. 最佳实践与高级配置
  7. 完整示例

什么是 Smarty?

Smarty 是一个成熟、稳定且功能强大的 PHP 模板引擎,它的核心思想是 “关注点分离”(Separation of Concerns)

php smarty模板配置
(图片来源网络,侵删)
  • PHP 文件 (后端逻辑):负责处理业务逻辑、数据库交互、数据计算等。
  • Smarty 模板文件 (前端展示):只负责展示数据,使用简单的模板语法,让前端开发者(不熟悉 PHP 的人)也能轻松修改页面布局和样式。

这样做的好处:

  • 代码清晰:逻辑和视图分离,代码更易读、易维护。
  • 协作方便:PHP 开发者和前端开发者可以并行工作。
  • 安全性:模板变量默认会被转义,有效防止 XSS 跨站脚本攻击。
  • 性能:Smarty 可以对模板进行编译和缓存,提升页面加载速度。

安装 Smarty

最推荐的方式是使用 Composer 来安装 Smarty,因为它能自动处理依赖关系,并让项目更易于管理。

如果你的项目还没有 composer.json 文件,先在项目根目录下运行:

composer init

安装 Smarty:

php 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 文件。这个目录必须可写,权限通常是 755777(开发环境)。
  • configs/:存放全局配置文件,可以在模板中加载。
  • cache/:存放 Smarty 生成的缓存文件,如果需要开启缓存,这个目录也必须可写

核心配置文件 (config.php)

在项目的 app 目录下创建一个 config.php 文件,用于初始化 Smarty 并进行基本配置。

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_delimiterright_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!