[ Laravel 5.2 文档 ] 服务 -- Session
1、简介
由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息。Laravel通过干净、统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括 Memcached、 Redis和 数据库。
1.1 配置
Session配置文件位于 config/session.php。默认情况下,Laravel使用的 session驱动为文件驱动,这对许多应用而言是没有什么问题的。在生产环境中,你可能考虑使用 memcached或者 redis驱动以便获取更快的session性能。
session驱动定义请求的Session数据存放在哪里,Laravel可以处理多种类型的驱动:
- file – session数据存储在 storage/framework/sessions目录下;
- cookie – session数据存储在经过加密的安全的cookie中;
- database – session数据存储在数据库中
- memcached / redis – session数据存储在memcached/redis中;
- array – session数据存储在简单PHP数组中,在多个请求之间是非持久化的。
注意:数组驱动通常用于运行测试以避免session数据持久化。
1.2 Session驱动预备知识
数据库
当使用 databasesession驱动时,需要设置表包含 session项,下面是该数据表的表结构声明:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->text('payload'); $table->integer('last_activity');});
你可以使用Artisan命令 session:table来生成迁移:
php artisan session:tablecomposer dump-autoloadphp artisan migrate
Redis
在Laravel中使用Redis session驱动前,需要通过Composer安装 predis/predis包。
1.3 其它Session相关问题
Laravel框架内部使用 flashsession键,所以你不应该通过该名称添加数据项到session。
如果你需要所有存储的session数据经过加密,在配置文件中设置 encrypt配置为 true。
2、基本使用
访问session
首先,我们来访问session,我们可以通过HTTP请求访问session实例,可以在控制器方法中通过类型提示引入请求实例,记住,控制器方法依赖通过Laravel服务容器注入:
<?phpnamespace 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中的数据:
Route::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']);
3、添加自定义Session驱动
要为Laravel后端session添加更多驱动,可以使用Session门面上的 extend方法。可以在服务提供者的 boot方法中调用该方法:
<?phpnamespace App\Providers;use Session;use App\Extensions\MongoSessionStore;use Illuminate\Support\ServiceProvider;class SessionServiceProvider extends ServiceProvider{ /** * Perform post-registration booting of services. * * @return void */ public function boot() { Session::extend('mongo', function($app) { // Return implementation of SessionHandlerInterface... return new MongoSessionStore; }); } /** * Register bindings in the container. * * @return void */ public function register() { // }}
需要注意的是自定义session驱动需要实现 SessionHandlerInterface接口,该接口包含少许我们需要实现的方法,一个MongoDB的实现如下:
<?phpnamespace App\Extensions;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) {}}
由于这些方法并不像缓存的 StoreInterface接口方法那样容易理解,我们接下来快速过一遍每一个方法:
- open 方法用于基于文件的session存储系统,由于Laravel已经有了一个 file session 驱动,所以在该方法中不需要放置任何代码,可以将其置为空方法。
- close 方法和 open 方法一样,也可以被忽略,对大多数驱动而言都用不到该方法。
- read 方法应该返回与给定$sessionId 相匹配的session数据的字符串版本,从驱动中获取或存储session数据不需要做任何序列化或其它编码,因为Laravel已经为我们做了序列化。
- write 方法应该讲给定 $data 写到持久化存储系统相应的 $sessionId , 例如MongoDB, Dynamo等等。
- destroy 方法从持久化存储中移除 $sessionId 对应的数据。
- gc 方法销毁大于给定$lifetime 的所有 session数据,对本身拥有过期机制的系统如 Memcached 和Redis而言,该方法可以留空。
session驱动被注册之后,就可以在配置文件 config/session.php中使用 mongo驱动了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
