[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)
- 入门指南
- 安装
- 部署
- 基础功能
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- URL
- Session
- 表单验证
- 错误
- 日志
- 前端开发
- Blade 模板
- 本地化
- 脚手架
- 编译资源 Mix
- 安全相关
- 用户认证
- API 认证
- 综合话题
- 命令行
- 广播
- 缓存
- 集合
- 事件
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View