session() 函数

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

thinkphp模板读取session
(图片来源网络,侵删)

读取单个 Session 值

使用 session('key') 的格式来读取指定键名的 Session 数据。

语法:

{session('键名')}

示例: 假设你在控制器中设置了以下 Session:

// 在某个控制器方法中
session('user_name', '张三');
session('user_id', 1001);

在模板中,你可以这样读取:

thinkphp模板读取session
(图片来源网络,侵删)
<!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 数据如下:

thinkphp模板读取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>

访问流程

  1. 访问 http://你的域名/user/login?username=王五
  2. login 方法执行,将用户名等信息存入 Session,并重定向到 /user/profile
  3. 浏览器请求 /user/profile
  4. profile 方法渲染 profile.html 模板。
  5. 模板中的 {session()}$Think.session 变量被替换为实际的 Session 值,最终显示欢迎信息。

希望这个详细的解释能帮助你完全掌握在 ThinkPHP 模板中读取 Session 的方法!