ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # Session ## 简介 ### 配置 Session 配置文件`config/session.php`,默认使用`file`驱动。生产环境中,建议使用`memcached`或`redis`驱动。Session`driver`的配置预设可选驱动: * `file`- 将 Session 存储在`storage/framework/sessions`中。 * `cookie`- Sessions 被存储在安全加密的 cookie 中。 * `database`- Sessions 被存储在关系型数据库中。 * `memcached`/`redis`- Sessions 被存储在基于高速缓存的存储系统中。 * `array`- Sessions 存储在 PHP 数组中,但不会被持久化。 > 提示:数组驱动一般用于[测试]并且防止存储在 Session 中的数据被持久化。 ### 驱动程序先决条件 #### 数据库驱动 ``` php artisan session:table php artisan migrate // .env 或者 config/session.php 设置 SESSION_DRIVER=database ``` #### Redis驱动 ``` $ composer require predis/predis // .env 或者 config/session.php 设置 SESSION_DRIVER=redis // redis 配置文件 config/database.php ``` ## 使用 Session ### 使用 Request 实例 ``` // 获取数据 $value = $request->session()->get('key'); // 设置默认值 $value = $request->session()->get('key', 'default'); // 闭包默认值 $value = $request->session()->get('key', function () { return 'default'; }); // 获取所有的 Session 数据, $data = $request->session()->all(); // 获取并删除 $value = $request->session()->pull('key', 'default'); // 判断 Session 中是否存在某个值 if ($request->session()->has('users')) { // 存在且不为 null } if ($request->session()->exists('users')) { // 存在,允许值为 null } // 存储数据 $request->session()->put('key', 'value'); // 在 Session 数组中保存数据 $request->session()->push('user.teams', 'developers'); // 删除指定 session $request->session()->forget('key'); // 删除所有 session $request->session()->flush(); ``` ### 使用辅助函数 ``` // 获取 session 中的一条数据... $value = session('key'); // 指定一个默认值... $value = session('key', 'default'); // 在 Session 中存储一条数据... session(['key' => 'value']); ``` ### 闪存数据 在 Session 中保存数据用于下一次请求,可以使用`flash`方法。使用这个方法保存在 Session 中的数据,只会保留到下一个 HTTP 请求到来之前,然后就会被删除。闪存数据主要用于短期的状态消息: ``` // 在 Session 中保存数据用于下一次请求 $request->session()->flash('status', 'Task was successful!'); // 所有一次性请求再次保留到下一次请求 $request->session()->reflash(); // 保存一次性数据 $request->session()->keep(['username', 'email']); ``` ### 重新生成 Session ID 重新生成 session ID 通常是为了防止恶意用户利用[session fixation](https://en.wikipedia.org/wiki/Session_fixation)对你的应用进行攻击。 如果你使用了内置函数`LoginController`,Laravel 会自动重新生成身份认证中的 Session ID。否则,你需要手动使用`regenerate`方法重新生成 Session ID。 ``` $request->session()->regenerate(); ``` ## 请求数据使用 Session ### 将输入数据传送到 Session ``` // 将输入数据传送到 Session,等待后续操作使用 $request->flash(); $request->flashOnly(['username', 'email']); // 只保留 username、email $request->flashExcept('password'); // 排除 password ``` ### 传送数据至 session 并跳转 ``` return redirect('form')->withInput(); return redirect('form')->withInput( $request->except('password') ); ``` ### 获取旧数据 ``` $username = $request->old('username'); // Blade模板显示旧数据 <input type="text" name="username" value="{{ old('username') }}"> ``` ## 跳转使用 Session ### 带有传送 Session 值的跳转 ``` Route::post('user/profile', function () { // Update the user's profile... return redirect('dashboard')->with('status', 'Profile updated!'); }); // 跳转后前台显示 @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif ``` ## 添加自定义 Session 驱动 [参考文档](https://learnku.com/docs/laravel/5.8/session/3898#db7cdb)