session() 函数
ThinkPHP 在模板中提供了一个全局的 session() 函数,这是最直接、最推荐的方式,它可以在模板的任何位置使用,语法与在控制器中使用的 session() 辅助函数非常相似。

读取单个 Session 值
使用 session('key') 的格式来读取指定键名的 Session 数据。
语法:
{session('键名')}
示例: 假设你在控制器中设置了以下 Session:
// 在某个控制器方法中
session('user_name', '张三');
session('user_id', 1001);
在模板中,你可以这样读取:

<!DOCTYPE html>
<html>
<head>用户信息</title>
</head>
<body>
<h1>欢迎, {session('user_name')}!</h1>
<p>您的用户ID是: {session('user_id')}</p>
</body>
</html>
渲染后的 HTML:
<!DOCTYPE html>
<html>
<head>用户信息</title>
</head>
<body>
<h1>欢迎, 张三!</h1>
<p>您的用户ID是: 1001</p>
</body>
</html>
读取整个 Session 数组
如果你需要一次性获取所有的 Session 数据,可以向 session() 函数传入 true。
语法:
{session(true)}
示例: 假设你的 Session 数据如下:

// 在控制器中
session([
'user_info' => ['name' => '李四', 'role' => 'admin'],
'login_time' => time()
]);
在模板中,你可以这样获取并遍历所有 Session:
<h2>当前所有 Session 数据:</h2>
<ul>
{volist name="session(true)" id="value"}
<li>{$key}: {$value}</li>
{/volist}
</ul>
渲染后的 HTML:
<h2>当前所有 Session 数据:</h2>
<ul>
<li>user_info: Array</li>
<li>login_time: 1678886400</li>
</ul>
注意: Session 数据是数组(如
user_info),直接输出会显示Array,如果你想访问数组中的具体元素,需要结合volist标签或使用点语法。
读取 Session 数组中的元素(点语法)
当 Session 的值是一个数组时,可以使用点语法 session('key.child_key') 来访问深层级的元素。
示例:
继续使用上面的 user_info 示例。
在模板中直接访问:
<p>用户角色: {session('user_info.role')}</p>
<p>用户名: {session('user_info.name')}</p>
渲染后的 HTML:
<p>用户角色: admin</p> <p>用户名: 李四</p>
替代方法:$Think.session 变量
除了 session() 函数,ThinkPHP 还提供了一个 $Think.session 内置变量,它包含了整个 Session 数组,你也可以通过它来访问 Session 数据。
读取单个 Session 值
语法:
{$Think.session.键名}
示例:
<h1>欢迎, {$Think.session.user_name}!</h1>
<p>您的用户ID是: {$Think.session.user_id}</p>
读取 Session 数组中的元素(点语法)
语法:
{$Think.session.键名.子键名}
示例:
<p>用户角色: {$Think.session.user_info.role}</p>
方法对比与选择
| 方法 | 语法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
session() 函数 |
{session('key')} |
语法简洁,与 PHP 原生 session() 函数习惯一致,可读性高。 |
无明显缺点。 | 强烈推荐,适用于绝大多数场景。 |
$Think.session 变量 |
{$Think.session.key} |
与 ThinkPHP 的 $Think.server、$Think.request 等变量风格统一。 |
语法稍长,当键名中有点号时,解析可能需要更小心。 | 当你需要遍历整个 Session 数组,或者习惯使用 $Think. 前缀变量时。 |
对于日常开发,强烈推荐使用 session() 函数,因为它最直观、最方便。
完整示例流程
下面是一个完整的例子,从控制器设置 Session 到模板读取 Session。
控制器 (app/controller/User.php)
<?php
namespace app\controller;
use think\facade\Session;
use think\Request;
class User
{
public function login(Request $request)
{
// 模拟登录成功
$username = $request->param('username', '访客');
// 设置 Session 数据
Session::set('user_name', $username);
Session::set('login_status', true);
Session::set('user_profile', [
'nickname' => 'ThinkPHP开发者',
'level' => 10
]);
// 跳转到个人中心页面
return redirect('/user/profile');
}
public function profile()
{
// 直接渲染模板,数据已经在 Session 中
return view('profile');
}
}
模板 (app/view/profile.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">个人中心</title>
<style>
body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
.info-box { border: 1px solid #ccc; padding: 15px; border-radius: 5px; margin-bottom: 20px; }
</style>
</head>
<body>
<h1>个人中心</h1>
{if session('login_status')}
<div class="info-box">
<h2>欢迎您, <strong>{session('user_name')}</strong>!</h2>
<p>您的昵称是: {session('user_profile.nickname')}</p>
<p>您的等级是: {session('user_profile.level')}</p>
</div>
{else /}
<p>您尚未登录,<a href="/user/login">请登录</a>。</p>
{/if}
<hr>
<h3>使用 $Think.session 变量读取:</h3>
{if $Think.session.login_status}
<p>用户名: {$Think.session.user_name}</p>
{/if}
</body>
</html>
访问流程
- 访问
http://你的域名/user/login?username=王五 login方法执行,将用户名等信息存入 Session,并重定向到/user/profile。- 浏览器请求
/user/profile。 profile方法渲染profile.html模板。- 模板中的
{session()}和$Think.session变量被替换为实际的 Session 值,最终显示欢迎信息。
希望这个详细的解释能帮助你完全掌握在 ThinkPHP 模板中读取 Session 的方法!
