# Session
- [Introduction](#introduction)
- [Basic Usage](#basic-usage)
- [Flash Data](#flash-data)
- [Adding Custom Session Drivers](#adding-custom-session-drivers)
## Introduction
Since HTTP driven applications are stateless, sessions provide a way to store information about the user across requests. Laravel ships with a variety of session back-ends available for use through a clean, unified API. Support for popular back-ends such as [Memcached](http://memcached.org), [Redis](http://redis.io), and databases is included out of the box.
### Configuration
The session configuration file is stored at `config/session.php`. Be sure to review the well documented options available to you in this file. By default, Laravel is configured to use the `file` session driver, which will work well for many applications. In production applications, you may consider using the `memcached` or `redis` drivers for even faster session performance.
The session `driver` defines where session data will be stored for each request. Laravel ships with several great drivers out of the box:
- `file` - sessions are stored in `storage/framework/sessions`.
- `cookie` - sessions are stored in secure, encrypted cookies.
- `database` - sessions are stored in a database used by your application.
- `memcached` / `redis` - sessions are stored in one of these fast, cached based stores.
- `array` - sessions are stored in a simple PHP array and will not be persisted across requests.
> **Note:** The array driver is typically used for running [tests](/docs/{{version}}/testing) to prevent session data from persisting.
### Driver Prerequisites
#### Database
When using the `database` session driver, you will need to setup a table to contain the session items. Below is an example `Schema` declaration for the table:
Schema::create('sessions', function ($table) {
$table->string('id')->unique();
$table->text('payload');
$table->integer('last_activity');
});
You may use the `session:table` Artisan command to generate this migration for you!
php artisan session:table
composer dump-autoload
php artisan migrate
#### Redis
Before using Redis sessions with Laravel, you will need to install the `predis/predis` package (~1.0) via Composer.
### Other Session Considerations
The Laravel framework uses the `flash` session key internally, so you should not add an item to the session by that name.
If you need all stored session data to be encrypted, set the `encrypt` configuration option to `true`.
## Basic Usage
#### Accessing The Session
First, let's access the session. We can access the session instance via the HTTP request, which can be type-hinted on a controller method. Remember, controller method dependencies are injected via the Laravel [service container](/docs/{{version}}/container):
session()->get('key');
//
}
}
When you retrieve a value from the session, you may also pass a default value as the second argument to the `get` method. This default value will be returned if the specified key does not exist in the session. If you pass a `Closure` as the default value to the `get` method, the `Closure` will be executed and its result returned:
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function() {
return 'default';
});
If you would like to retrieve all data from the session, you may use the `all` method:
$data = $request->session()->all();
You may also use the global `session` PHP function to retrieve and store data in the session:
Route::get('home', function () {
// Retrieve a piece of data from the session...
$value = session('key');
// Store a piece of data in the session...
session(['key' => 'value']);
});
#### Determining If An Item Exists In The Session
The `has` method may be used to check if an item exists in the session. This method will return `true` if the item exists:
if ($request->session()->has('users')) {
//
}
#### Storing Data In The Session
Once you have access to the session instance, you may call a variety of functions to interact with the underlying data. For example, the `put` method stores a new piece of data in the session:
$request->session()->put('key', 'value');
#### Pushing To Array Session Values
The `push` method may be used to push a new value onto a session value that is an array. For example, if the `user.teams` key contains an array of team names, you may push a new value onto the array like so:
$request->session()->push('user.teams', 'developers');
#### Retrieving And Deleting An Item
The `pull` method will retrieve and delete an item from the session:
$value = $request->session()->pull('key', 'default');
#### Deleting Items From The Session
The `forget` method will remove a piece of data from the session. If you would like to remove all data from the session, you may use the `flush` method:
$request->session()->forget('key');
$request->session()->flush();
#### Regenerating The Session ID
If you need to regenerate the session ID, you may use the `regenerate` method:
$request->session()->regenerate();
### Flash Data
Sometimes you may wish to store items in the session only for the next request. You may do so using the `flash` method. Method stored in the session using this method will only be available during the subsequent HTTP request, and then will be deleted. Flash data is primarily useful for short-lived status messages:
$request->session()->flash('status', 'Task was successful!');
If you need to keep your flash data around for even more requests, you may use the `reflash` method, which will keep all of the flash data around for an additional request. If you only need to keep specific flash data around, you may use the `keep` method:
$request->session()->reflash();
$request->session()->keep(['username', 'email']);
## Adding Custom Session Drivers
To add additional drivers to Laravel's session back-end, you may use the `extend` method on the `Session` [facade](/docs/{{version}}/facades). You can call the `extend` method from the `boot` method of a [service provider](/docs/{{version}}/providers):
- The `open` method would typically be used in file based session store systems. Since Laravel ships with a `file` session driver, you will almost never need to put anything in this method. You can leave it as an empty stub. It is simply a fact of poor interface design (which we'll discuss later) that PHP requires us to implement this method.
- The `close` method, like the `open` method, can also usually be disregarded. For most drivers, it is not needed.
- The `read` method should return the string version of the session data associated with the given `$sessionId`. There is no need to do any serialization or other encoding when retrieving or storing session data in your driver, as Laravel will perform the serialization for you.
- The `write` method should write the given `$data` string associated with the `$sessionId` to some persistent storage system, such as MongoDB, Dynamo, etc.
- The `destroy` method should remove the data associated with the `$sessionId` from persistent storage.
- The `gc` method should destroy all session data that is older than the given `$lifetime`, which is a UNIX timestamp. For self-expiring systems like Memcached and Redis, this method may be left empty.
Once the session driver has been registered, you may use the `mongo` driver in your `config/session.php` configuration file.