日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法

發布時間:2024/9/27 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

我們知HTTP請求是沒有狀態的,兩個請求之間沒有直接的關聯關系。但大多數情況下, 我們需要保持用戶的會話間數據的連續性,這時,為了數據安全起見, 有必要在服務器上臨時存儲一些上下文數據了。

這就是 session 設計的目的。

代碼時間

在laravel中可以使用系統提供的Session類方便地操作會話數據,而且其存儲介質也是抽象出來的, 可以無縫銜接,只是驅動更換一下罷了。

框架內Session支持的驅動類型如下:

  • file 存儲在 storage/framework/sessions 目錄
  • cookie 存儲在安全加密的 cookie 中
  • database 創建專門的表,存儲在數據庫內
  • memcached, redis 存儲在這些內存數據庫內
  • array 每次請求有效,用完即焚,適合測試使用

session 數據以簡單的鍵值方式存儲,所以讀取某個鍵名的值,只需

session()->get('user_id');

其中函數 session() 是laravel系統提供的助手函數。我們看一下源碼的定義:

function session($key = null, $default = null) {if (is_null($key)) {return app('session');} ?if (is_array($key)) {return app('session')->put($key);} ?return app('session')->get($key, $default); }

如果鍵名為空,返回一個 app('session'),使用應用容器實例化一個Session對象。 其中,別名 session 在門面 IlluminateSupportFacadesSession 內注冊的。

因為session是在頁面請求之間的保持,所以Request對象也提供了session的方法。 在 FormRequestServiceProvider 內注冊請求體時調用初始化方法:

$request = FormRequest::createFrom($app['request'], $request);

其中 createFrom 方法做了session數據寫入:

if ($session = $from->getSession()) {$request->setLaravelSession($session); }

所以有了以上基礎,我們就可以這樣鏈式調用獲取一個請求所對應的session值:

Route::get('dashboard', function (Request $request) {$request->session()->get('user_id'); });

或者使用依賴注入的方式,直接從存儲中讀取數據:

Route::get('dashboard', function (IlluminateSessionStore $session) {return $session->get('user_id'); });

為了發揮PHP靈活的特點,助手函數session也提供了完整無二的類似 request cache等等的操作方式讀寫數據。 比如讀取某個鍵的值:

$value = session()->get('key'); $value = session('key');

還有寫入值:

session()->put('key', 'value'); session(['key', 'value']);

使用技巧

下面說一些在存儲session數據上的用法,以及框架提供的類的方法。 比如直接根據鍵名獲取值:

$points = session()->get('points');

如果鍵名不存在則使用默認值:

$points = session()->get('points', 0);

來看一下 get 方法的定義,我們會學到更為靈活的用法:

public function get($key, $default = null) {return Arr::get($this->attributes, $key, $default); }

注意在變量類型提示上,$default 是 mixed 泛型。再接著看 Arr::get() 方法的使用:

if (! static::accessible($array)) {return value($default); }

如果傳入的$this->attributes 是數組,那么使用 value() 助手函數取值。 看一下該助手函數的定義:

function value($value) {return $value instanceof Closure ? $value() : $value; }

我們發現,如果傳入的是一個匿名函數,那么直接進行了調用,并返回執行后的值。這樣, 我們就可以深度改造一下上面的 session()->get() 方法的第二個 default ,將其傳入一個匿名函數, 用于處理獲取默認值的邏輯。

看這樣一段代碼:

$points = session()->get('points', function () {return (new PointGetterService)->getPoints(); });

是不是瞬間又有新知識了 :-) 有了匿名函數的支持,這個默認值你可以玩出花兒來了~~

寫在最后

本文介紹了laravel處理請求間數據的保持方式:session。比介紹了在程序內獲取session的方式, 并深入源碼,探索了Session::get() 方法的高階用法。

Happy coding :-)

我是@程序員小助手,持續分享編程知識,歡迎關注。

總結

以上是生活随笔為你收集整理的request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。