Smarty按页面独立分配变量方法及templates_c目录作用咨询
问题解答
1. 页面独立分配变量的实现方案
不用在入口文件集中赋值的话,两种方式都可行,更推荐分页面处理脚本+include的方式,直观且好维护:
- 先根据
$_GET['page']判断当前加载的页面,比如$page = $_GET['page'] ?? 'home'; - 引入对应页面的PHP逻辑文件,比如
$page为home时,执行include 'pages/home.php';,这个文件里只负责给Home.tpl分配变量:// home.php $smarty->assign('welcome_msg', '欢迎访问首页'); $smarty->assign('article_list', $db->getArticles()); - 同理,
create.php里仅处理Create.tpl的变量:// create.php $smarty->assign('form_title', '创建新内容'); $smarty->assign('form_fields', ['title', 'content']); - 最后在入口文件统一渲染对应模板:
$smarty->display("$page.tpl");
Smarty本身没有专门内置方案自动绑定页面与变量,但这种分文件处理的方式完全满足需求,且不会出现变量覆盖——每个页面的处理脚本仅在对应页面加载时执行,变量属于当前请求周期,互不干扰。
2. templates_c目录的作用
templates_c是Smarty的编译目录,核心作用是把你编写的.tpl模板文件转换成可执行的PHP代码。
比如你在模板里写{$welcome_msg},Smarty会将其编译成<?php echo $this->_tpl_vars['welcome_msg']; ?>这类PHP代码,然后把编译后的PHP文件存储在templates_c中。
3. 为什么要保存编译后的模板,和cache目录的区别
二者是不同层面的缓存:
templates_c存储编译后的模板PHP文件,目的是避免每次请求都重新解析模板中的Smarty标签(比如循环、变量输出、逻辑判断)。只要原.tpl文件未修改,Smarty就会直接复用templates_c里的编译文件,省去标签解析的开销。cache目录存储最终渲染好的HTML静态内容,比如首页内容10分钟内不变,可开启Smarty缓存,把渲染完成的HTML存在cache里,下次请求直接输出该HTML,无需执行PHP逻辑,节省整个页面的生成时间。
不能直接显示编译后的模板,因为编译后的是PHP代码,不是用户可直接查看的HTML,必须通过PHP执行才能生成有效内容。如果不保存编译后的文件,每次请求都要重新解析模板标签,尤其是复杂模板,性能损耗会非常大。
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

