Session
Session
配置
Session 的相关配置都保存在 config/session.php 文件中,默认情况下,Laravel 使用 database 来保存 Session,此外还有多个 Session Driver 可供选择:
file:将 Session 保存到storage/framework/sessions目录下。cookie:将 Session 保存到加密的 Cookie 中。database:将 Session 保存到数据库中。memcached/redis:将 Session 保存到 Memcached 或 Redis 中。array:将 Session 保存到内存中,不会持久化。
使用 database 存储 Session 时,需要创建一个 Session 表,一般来说默认的 0001_01_01_000000_create_users_table.php 会创建这个表,如果没有,可以使用命令初始化这个表:
php artisan make:session-table
php artisan migrate提示
在 API 路由组中使用 Session 时,由于默认情况下 api 中间件组不包含 Session 中间件,所以需要先启用 Session 中间件:
->withMiddleware(function (Middleware $middleware) {
$middleware->prependToGroup('api', [
StartSession::class,
]);
})操作 Session
存储
使用 Request 上的 session()->put() 方法或者全局 session 方法可以在 Session 中存储数据:
public function getMember(Request $request, string $id = '')
{
$request->session()->put('memberId', $id);
session(['tags' => ['A']]);
return '';
}push 方法可以将新值添加到数组的参数上:
public function getMember(Request $request, string $id = '')
{
$request->session()->push('tags', 'B');
return '';
}pull 方法从 session 中查找并删除一个值:
public function getMember(Request $request, string $id = '')
{
$request->session()->pull('memberId');
$deleted = $request->session()->pull('tags');
return '';
}如果一个参数是整数,那么可以使用 increment 和 decrement 方法对 session 的值进行递增或递减:
$request->session()->increment('count');
$request->session()->increment('count', $incrementBy = 2);
$request->session()->decrement('count');
$request->session()->decrement('count', $decrementBy = 2);读取
public function index(Request $request)
{
Log::info('index', [
'memberId' => $request->session()->get('memberId'),
'tags' => session('tags'),
'notExists' => session('notExists', 'default'),
'all' => $request->session()->all(),
]);
return '';
}only 和 except 可以读取 session 的子集:
public function index(Request $request)
{
Log::info('index', [
'only' => $request->session()->only(['tags']),
'except' => $request->session()->except(['tags']),
]);
return '';
}使用 has、exists、missing 方法可以检查 session 中是否存在指定参数,如果参数存在且不为 null,has 返回 true,如果参数存在即使为 null,exists 返回 true,如果指定参数不存在,missing 返回 true:
public function index(Request $request)
{
Log::info('index', [
'has' => $request->session()->has('null'),
'exists' => $request->session()->exists('null'),
'missing' => $request->session()->missing('null'),
]);
return '';
}删除
forget 方法将从 session 中删除一些数据,如果想删除所有的 session 数据,请使用 flush 方法:
public function getMember(Request $request, string $id = '')
{
$request->session()->forget(['tags', 'memberId']);
$request->session()->flush();
return '';
}Session 失效
使用 regenerate 方法可以刷新 session id:
$request->session()->regenerate();如果要重新生成 session id 并且删除所有数据可以使用 invalidate 方法:
$request->session()->invalidate();自定义 Session Driver
实现 SessionHandlerInterface 接口的类可以作为 Session Driver,然后在 Service Provider 中注册:
public function boot(): void
{
Session::extend('mongo', function (Application $app) {
// Return an implementation of SessionHandlerInterface...
return new MongoSessionHandler;
});
}然后修改 config/session.php 中的 driver 选项为 mongo 即可。
etcd Session Driver
TODO: