
本文介绍如何在 smarty 模板引擎中实现“按需分配变量”,避免在主入口文件中集中赋值导致逻辑混乱,通过分离页面专属 php 控制器(如 home.php、create.php)来解耦变量初始化与模板渲染。
本文介绍如何在 smarty 模板引擎中实现“按需分配变量”,避免在主入口文件中集中赋值导致逻辑混乱,通过分离页面专属 php 控制器(如 home.php、create.php)来解耦变量初始化与模板渲染。
在使用 Smarty 构建基于 $_GET['page'] 路由的单入口网站时,一个常见痛点是:所有模板变量都在 index.php 中统一 assign(),不仅难以维护,还容易因变量名冲突(如多个页面都设 'title')引发覆盖问题。理想方式应是——每个页面(如 Home、Create)拥有独立的变量初始化逻辑,且与模板一一对应、职责清晰。
Smarty 本身不提供“自动加载同名 PHP 控制器”的内置机制(如 Home.tpl 自动执行 Home.php),但可通过轻量级约定达成目标。推荐采用 “路由分发 + 独立控制器文件” 模式:
✅ 推荐结构(清晰、可扩展、符合 MVC 思维)
index.php ← 主入口:初始化 Smarty + 路由分发 home.php ← Home 页面专属控制器:assign 变量 + display create.php ← Create 页面专属控制器:assign 变量 + display templates/ Home.tpl Create.tpl templates_c/ ← Smarty 编译缓存(PHP 字节码,非源码) cache/ ← 运行时 HTML 缓存(需手动启用)
✅ index.php 示例(路由中枢)
<?php
require 'smarty-4.2.0/libs/Smarty.class.php';
$smarty = new Smarty();
// 全局配置(一次设置,全局生效)
$smarty->setTemplateDir('templates');
$smarty->setCompileDir('templates_c');
$smarty->setCacheDir('cache');
$smarty->setConfigDir('configs');
// 设置全局变量(如站点名称、导航菜单等)
$smarty->assign('site_name', 'My Awesome Site');
// 路由分发:根据 $_GET['page'] 加载对应控制器
$page = $_GET['page'] ?? 'home';
switch ($page) {
case 'home':
include 'home.php'; // → 赋值 $title, $varA 并渲染 Home.tpl
break;
case 'create':
include 'create.php'; // → 赋值 $title, $varID 并渲染 Create.tpl
break;
default:
$smarty->assign('title', '404 Not Found');
$smarty->display('error.tpl');
exit;
}✅ home.php 示例(页面专属逻辑)
<?php
// home.php —— 仅负责 Home 页面的数据准备
$smarty->assign('title', 'Home page');
$smarty->assign('varA', 'text text text');
$smarty->display('Home.tpl'); // 注意:文件名大小写需与模板一致✅ create.php 示例(页面专属逻辑)
<?php
// create.php —— 仅负责 Create 页面的数据准备
$smarty->assign('title', 'Create page');
$smarty->assign('varID', 33442222244);
$smarty->display('Create.tpl');⚠️ 关键注意事项
-
templates_c/的作用:它存储的是 Smarty 将.tpl编译生成的 PHP 可执行脚本(非原始 PHP 源码),用于加速后续渲染(跳过语法解析)。首次访问时生成,之后直接include执行,这是性能优化核心,不可删除或禁用(除非开发调试期设force_compile=true)。 -
cache/与templates_c/的区别:前者缓存最终 HTML 输出(需开启$smarty->caching = true),后者缓存编译后的 PHP 代码,二者解决不同层级的性能问题。 -
安全性增强建议:
- 对
$_GET['page']做白名单校验(如in_array($page, ['home','create'])),防止目录遍历攻击; - 将控制器文件(
home.php等)置于 Web 根目录之外,或添加<?php exit; ?>头部防止直接访问; - 使用
htmlspecialchars()或 Smarty 内置过滤器(如|escape)输出变量,防范 XSS。
- 对
✅ 总结
通过将变量赋值逻辑下沉至页面专属 PHP 控制器(如 home.php),你获得了:
? 高内聚:每个页面的数据逻辑自包含;
? 低耦合:index.php 仅负责路由与基础配置;
? 易维护:新增页面只需添加一对 xxx.php + xxx.tpl;
? 符合 Smarty 设计哲学:PHP 层专注数据准备,Smarty 层专注模板呈现。
这并非“绕过 Smarty”,而是正确利用其松耦合特性——Smarty 是模板引擎,不是全栈框架;业务逻辑(包括变量分配)本就该由 PHP 控制器承担。

















