Skip to content

会话

配置

由于 HTTP 驱动的应用程序是无状态的,会话提供了一种在请求之间存储用户信息的方法。Laravel 提供了多种会话后端,通过一个干净、统一的 API 可供使用。支持流行的后端如 MemcachedRedis 和数据库的支持是开箱即用的。

会话配置存储在 config/session.php 中。请务必查看此文件中提供的详细选项。默认情况下,Laravel 配置为使用 file 会话驱动,这对于大多数应用程序来说都能很好地工作。

在使用 Laravel 的 Redis 会话之前,您需要通过 Composer 安装 predis/predis 包 (~1.0)。

lightbulb

如果您需要加密所有存储的会话数据,请将 encrypt 配置选项设置为 true

lightbulb

当使用 cookie 会话驱动时,您绝不应该从 HTTP 内核中移除 EncryptCookie 中间件。如果移除此中间件,您的应用程序将容易受到远程代码注入的攻击。

保留键

Laravel 框架内部使用 flash 会话键,因此您不应以该名称向会话添加项目。

会话使用

可以通过 HTTP 请求的 session 方法、Session facade 或 session 辅助函数访问会话。当不带参数调用 session 辅助函数时,它将返回整个会话对象。例如:

php
session()->regenerate();

在会话中存储项目

php
Session::put('key', 'value');

session(['key' => 'value']);

将值推送到数组会话值中

php
Session::push('user.teams', 'developers');

从会话中检索项目

php
$value = Session::get('key');

$value = session('key');

检索项目或返回默认值

php
$value = Session::get('key', 'default');

$value = Session::get('key', function() { return 'default'; });

检索项目并忘记它

php
$value = Session::pull('key', 'default');

从会话中检索所有数据

php
$data = Session::all();

确定会话中是否存在项目

php
if (Session::has('users'))
{
	//
}

从会话中移除项目

php
Session::forget('key');

移除会话中的所有项目

php
Session::flush();

重新生成会话 ID

php
Session::regenerate();

闪存数据

有时您可能希望仅在下一个请求中存储项目在会话中。您可以使用 Session::flash 方法来实现:

php
Session::flash('key', 'value');

重新闪存当前闪存数据以用于另一个请求

php
Session::reflash();

仅重新闪存闪存数据的子集

php
Session::keep(['username', 'email']);

数据库会话

使用 database 会话驱动时,您需要设置一个表来包含会话项目。以下是表的 Schema 声明示例:

php
Schema::create('sessions', function($table)
{
	$table->string('id')->unique();
	$table->text('payload');
	$table->integer('last_activity');
});

当然,您可以使用 session:table Artisan 命令为您生成此迁移!

php
php artisan session:table

composer dump-autoload

php artisan migrate

会话驱动

会话“驱动”定义了每个请求的会话数据将存储在哪里。Laravel 开箱即用地提供了几个很好的驱动:

  • file - 会话将存储在 storage/framework/sessions 中。
  • cookie - 会话将存储在安全、加密的 cookie 中。
  • database - 会话将存储在应用程序使用的数据库中。
  • memcached / redis - 会话将存储在这些快速的缓存存储中。
  • array - 会话将存储在一个简单的 PHP 数组中,并且不会在请求之间持久化。
lightbulb

数组驱动通常用于运行单元测试,因此不会持久化任何会话数据。