Session

2018-02-24 15:52 更新

自定義 session 驅(qū)動(dòng)來擴(kuò)展 Laravel 和擴(kuò)展緩存系統(tǒng)一樣簡(jiǎn)單。我們將會(huì)再一次使用 extend 方法來注冊(cè)自定義代碼:

Session::extend('mongo', function($app)
{
    // Return implementation of SessionHandlerInterface
});

在哪里擴(kuò)展 Session

你應(yīng)該把 session 擴(kuò)展代碼放置在 AppServiceProvider 的 boot 方法里。

實(shí)現(xiàn) Session 擴(kuò)展

要注意我們的自定義緩存驅(qū)動(dòng)應(yīng)該要實(shí)現(xiàn) SessionHandlerInterface 。這個(gè)接口只包含少數(shù)需要實(shí)現(xiàn)的簡(jiǎn)單方法。一個(gè)基本的 MongoDB 實(shí)現(xiàn)會(huì)看起來像這樣:

class MongoHandler implements SessionHandlerInterface {

    public function open($savePath, $sessionName) {}
    public function close() {}
    public function read($sessionId) {}
    public function write($sessionId, $data) {}
    public function destroy($sessionId) {}
    public function gc($lifetime) {}

}

因?yàn)檫@些方法不像緩存的 StoreInterface 一樣容易理解,讓我們快速地看過這些方法做些什么:

  1. open 方法通常會(huì)被用在基于文件的 session 保存系統(tǒng)。因?yàn)?Laravel 附帶一個(gè) file session 驅(qū)動(dòng),幾乎不需要在這個(gè)方法放任何東西。你可以讓它留空。PHP 要求我們?nèi)?shí)現(xiàn)這個(gè)方法,事實(shí)上明顯是個(gè)差勁的接口設(shè)計(jì) (我們將會(huì)晚點(diǎn)討論它)。
  2. close 方法,就像 open 方法,通常也可以忽略。對(duì)大部份的驅(qū)動(dòng)來說,并不需要它。
  3. read 方法應(yīng)該返回與給定 $sessionId 關(guān)聯(lián)的 session 數(shù)據(jù)的字串形態(tài)。當(dāng)你的驅(qū)動(dòng)取回或保存 session 數(shù)據(jù)時(shí)不需要做任何序列化或進(jìn)行其他編碼,因?yàn)?Laravel 將會(huì)為你進(jìn)行序列化
  4. write 方法應(yīng)該寫入給定 $data 字串與 $sessionId 的關(guān)聯(lián)到一些永久存儲(chǔ)系統(tǒng),例如:MongoDB、 Dynamo、等等。
  5. destroy 方法應(yīng)該從永久存儲(chǔ)移除與 $sessionId 關(guān)聯(lián)的數(shù)據(jù)。
  6. gc 方法應(yīng)該銷毀所有比給定 $lifetime UNIX 時(shí)間戳記還舊的 session 數(shù)據(jù)。對(duì)于會(huì)自己過期的系統(tǒng)如 Memcached 和 Redis,這個(gè)方法可以留空。

當(dāng) SessionHandlerInterface 實(shí)現(xiàn)完成,我們準(zhǔn)備好要用 Session 管理者注冊(cè)它:

Session::extend('mongo', function($app)
{
    return new MongoHandler;
});

當(dāng) session 驅(qū)動(dòng)已經(jīng)被注冊(cè),我們可以在 config/session.php 配置文件使用 mongo 驅(qū)動(dòng)。

注意: 記住,如果你寫了個(gè)自定義 session 處理器,請(qǐng)?jiān)?Packagist 分享它!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)