laravel session的使用

來源:互聯網
上載者:User
用Laravel開發應用,把原有的代碼copy過來,以前的代碼session使用了$_SESSION,本以為移植過來可以很好的啟動並執行,因為沒有依賴其他的組件,結果出現了這個

Undefined variable: _SESSION

Laravel的session的設定檔配置在 app/config/session.php 中,使用時可以看看 session 設定檔中可用的選項設定及注釋。

Laravel 預設使用 file 的方式來實現 session的。她並不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相關的session函數,例如session_start(), $_SESSION。Laravel在運行過程中會在app/storage/session/目錄寫入session的資訊,所以這個目錄需要有寫入權限,否者session就無法寫入成功。

Laravel除了使用預設的file作為session的實現,還支援cookie, Memcached, Redis 和資料庫的後端驅動作為session的實現。必要的時候還需要自己實現一個session的實現方式,比如在公眾帳號和使用者的互動,這中session就無法直接使用,因為每次都是伺服器來請求,無法通過請求的來源來辨別使用者。

laravel的session簡要API

Session的API還是比較簡單的,大家看看中文文檔也大概知道是怎麼個意思。但是有那麼幾個還不太好理解。

//session的永久儲存(在不到期範圍內)

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

//等同於PHP的原生session

$_SESSION['key'] = 'value';

//get操作

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

//去除操作並刪除,類似pop概念

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

//檢測是否存在key

Session::has('users');

//刪除key

Session::forget('key');

這個對應只要session不到期,基本上是永久儲存,下次http請求也是存在的。不同於下面的flash概念。

laravel的session中flash概念

但是Laravel出了個快閃flash的概念,把我一下子給搞混了。這個flash兩次請求有效(本次和下次請求有效),與本次請求取操作多少次無關。

//儲存key,value

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

//取值方法還是一樣的

Session::get('key');

//重新整理快閃資料時間,保持到下次請求

Session::keep(array('username', 'email'));

這個flash的概念和上面的put的概念不太一樣。

put :這個對應只要session不到期,基本上是永久儲存,下次請求也是存在的。

flash :儲存的值,本次請求可以使用,下次http請求可以使用,再下一次就不存在了。

也就是說下一次的請求用完就被銷毀了,不會讓session的值變的越來越大,可以儲存一些臨時的資料。

這中情況的使用情境比如有:

使用者請求了頁面,出現錯誤資訊,重新導向到一個新的頁面,需要展示之前的資料。(雖然可以通過url參數來傳遞,處理不好可能會有xss漏洞)。

使用者訪問了一個頁面,過濾器發現沒許可權,儲存當前頁面url,重新導向到登入頁面,登入成功,取出值,重新導向到原先的頁面。(這裡可能需要重新整理儲存的快閃資料)

session落地的時間

我天真的以為使用了Session::put函數就能儲存這個變數了。於是My Code這樣寫:

class LoginController {

public function login(){

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

print_r( Session::all() ); //取出來看看是否put成功

exit; //習慣性的調試都exit,不執行後續代碼

//return Redirect::to(/); 架構在return後還會有後續的代碼執行的

}

}

結果下次請求就是找不到本次的Session,而且看app/storage/session目錄就是沒有檔案產生。總感覺不對勁啊。

後來看到網路上有個方法Session::save(),於是我也用了下,居然發現成功的產生了session的檔案。於是我感覺到,Laravel不用php原生的session,那麼在controller之後應該做了一些事情,將session寫入到檔案中,而不是每次put操作都寫操作,這樣會IO操作太頻繁的,影響效能的。

查看調用相關的代碼。laravel編譯後,在bootstrap/compiled.php中

class Middleware implements HttpKernelInterface

{

...

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)

{

$this->checkRequestForArraySessions($request);

if ($this->sessionConfigured()) {

$session = $this->startSession($request); // 啟動session

$request->setSession($session);

}

$response = $this->app->handle($request, $type, $catch); // 調用controller的method

if ($this->sessionConfigured()) {

$this->closeSession($session); //關閉session

$this->addCookieToResponse($response, $session);

}

return $response;

}

...

protected function closeSession(SessionInterface $session)

{

$session->save(); // 儲存session

$this->collectGarbage($session);

}

}

小提示:如果不知道函數調用情況,可以在controller中throw new Exception();,然後在/config/app.php的debug更改為debug=>true。可以看到函數的調用關係。

可以看見,在調用完controller之後,調用了session->save()的方法,來主動的儲存session。這樣session才能落地儲存起來,如果在controller或者view裡面寫了exit;,那麼session是不會被儲存的,除非主動的寫Session::save()才能手工的儲存起來。因此在debug調試的時候千萬要注意啊。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.