[TOC]
## 1、簡介
由于HTTP驅動的應用是無狀態的,所以我們使用session來存儲用戶請求信息。[Lumen](http://laravelacademy.org/tags/lumen "View all posts in Lumen")通過干凈、統一的API處理后端各種有效session驅動,目前支持的流行后端驅動包括[Memcached](http://memcached.org/)、[Redis](http://redis.io/)和數據庫。
#### 1.1 開啟Session
要開啟session,你需要取消`bootstrap/app.php`文件中`$app->middleware()`方法調用前的注釋。
#### 1.2 配置
session驅動由.env文件中的配置選項SESSION_DRIVER來控制。默認情況下,Lumen使用的`session`驅動為memcached,這對許多應用而言是沒有什么問題的。在生產環境中,你可以考慮使用`memcached`或者`redis`驅動以便獲取更快的session性能。
`session`驅動定義請求的session數據存放在哪里,Lumen可以處理多種類型的驅動:
* `file`?– session數據存儲在?`storage/framework/sessions`目錄下;
* `cookie`?– session數據存儲在經過加密的安全的cookie中;
* `database`?– session數據存儲在數據庫中
* `memcached`?/?`redis`?– session數據存儲在memcached/redis中;
* `array`?– session數據存儲在簡單PHP數組中,在多個請求之間是非持久化的。
> 注意:數組驅動通常用于運行測試以避免session數據持久化。
#### 1.3 Session驅動預備知識
**數據庫**
當使用`database`session驅動時,需要設置表包含`session`項,下面是該數據表的表結構聲明:
~~~
Schema::create('sessions', function ($table) {
$table->string('id')->unique();
$table->text('payload');
$table->integer('last_activity');
});
~~~
Redis
在Lumen中使用Redis?`session`驅動前,需要通過Composer安裝`predis/predis`包以及illuminate/redis包。
#### 1.4 其它Session相關問題
Lumen框架內部使用`flash`?session鍵,所以你不應該通過該名稱添加數據項到session。
## 2、基本使用
**訪問session**
首先,我們來訪問session,我們可以通過HTTP請求訪問session實例,可以在控制器方法中通過類型提示引入請求實例,記住,控制器方法依賴通過Lumen[服務容器](http://laravelacademy.org/post/471.html)注入:
~~~
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 顯示指定用戶的屬性
*
* @param Request $request
* @param int $id
* @return Response
*/
public function showProfile(Request $request, $id)
{
$value = $request->session()->get('key');
//
}
}
~~~
從session中獲取數據的時候,還可以傳遞默認值作為第二個參數到`get`方法,默認值在指定鍵在session中不存在時返回。如果你傳遞一個閉包作為默認值到`get`方法,該閉包會執行并返回執行結果:
~~~
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function() {
return 'default';
});
~~~
如果你想要從session中獲取所有數據,可以使用`all`方法:
~~~
$data = $request->session()->all();
~~~
還可以使用全局的PHP函數`session`來獲取和存儲session中的數據:
~~~
$app->get('home', function () {
// 從session中獲取數據...
$value = session('key');
// 存儲數據到session...
session(['key' => 'value']);
});
~~~
**判斷session中是否存在指定項**
`has`方法可用于檢查數據項在session中是否存在。如果存在的話返回`true`:
~~~
if ($request->session()->has('users')) {
//
}
~~~
**在session中存儲數據**
獲取到session實例后,就可以調用多個方法來與底層數據進行交互,例如,`put`方法存儲新的數據到session中:
~~~
$request->session()->put('key', 'value');
~~~
**推送數據到數組session**
`push`?方法可用于推送數據到值為數組的session,例如,如果`user.teams`鍵包含團隊名數組,可以像這樣推送新值到該數組:
~~~
$request->session()->push('user.teams', 'developers');
~~~
**獲取并刪除數據**
`pull`方法將會從session獲取并刪除數據:
~~~
$value = $request->session()->pull('key', 'default');
~~~
**從session中刪除數據項**
`forget`方法從session中移除指定數據,如果你想要從session中移除所有數據,可以使用`flush`方法:
~~~
$request->session()->forget('key');
$request->session()->flush();
~~~
**重新生成Session ID**
如果你需要重新生成session ID,可以使用`regenerate`方法:
~~~
$request->session()->regenerate();
~~~
#### 2.1 一次性數據
有時候你可能想要在session中存儲只在下個請求中有效的數據,可以通過`flash`方法來實現。使用該方法存儲的session數據只在隨后的HTTP請求中有效,然后將會被刪除:
~~~
$request->session()->flash('status', 'Task was successful!');
~~~
如果你需要在更多請求中保持該一次性數據,可以使用`reflash`方法,該方法將所有一次性數據保留到下一個請求,如果你只是想要保存特定一次性數據,可以使用`keep`方法:
~~~
$request->session()->reflash();
$request->session()->keep(['username', 'email']);
~~~