Laravel5.5 session 的配置及使用示例讲解
○ 背景
- 近期正进行 Laravel5.5 框架的学习,当然还是在一点点深入,虽然没有信息研究核心源码,至少要能灵活顺畅的应用,接下来,主要是介绍Session在 Laravel5.5 中的应用,欢迎指导建议,必将虚心求知 …
框架:Laravel5.5
重点:Session
○ 概述
⑴. 提示信息
- 首先,如果在 Laravel 中使用 session 功能,需要明确以下的知识点:
Laravel 并没有使用 PHP 内置的 Session 功能,而且自己实现了一套更加灵活更加强大的 Session 机制,核心逻辑请参考
Illuminate\Session\Middleware\StartSession
这个中间件,因此在Laravel
应用中不要试图通过$_SESSION
方式去获取应用的Session
值,这是徒劳的。
另外,还有一个大家都感到困惑的问题,就是在Laravel
的控制器构造函数中是无法获取应用Session
数据的,这是因为Laravel 的 Session 通过 StartSession 中间件启动
,既然是中间件就会在服务容器注册所有服务之后执行,而控制器们的构造函数都是在容器注册服务的时候执行的,所以这个时候 Session 尚未启动,又何来的获取数据呢?解决办法是将获取 Session 数据逻辑后置或者在构造函数中引入在StartSession
之后执行的中间件
⑵. 配置信息
- 主要能使用到的配置信息,
config.session
一般不要更改此文件,若有改动应该配置.env
文件.
'driver' => env('SESSION_DRIVER', 'file'), //驱动选择模式
'lifetime' => env('SESSION_LIFETIME', 120), //默认120分钟的有效时间
○ 使用指导
⑴. file 驱动方式
-
默认框架的配置信息下,使用的是 file 类型,也可以配置 .env 文件中的:
SESSION_DRIVER=file
主要使用的几个方法为:
①. 首先是设置需要的
key
值,经个人测试发现,需要添加session()->save();
才能生效
$request->session()->put('cmsAID', $tag);
//测试发现 "$request->" 可加也可不加!
$request->session()->save();
②. session 获取 key
值,较为简单
$cmsAID = $request->session()->get('cmsAID');
③. 从 Session 中移除指定数据
$request->session()->forget('cmsAID');
【备注】:
- session 存储的文件默认存放于
storage/framework/sessions
目录下
- 文档中有说 ,如果你想要从 Session 中移除所有数据,可以使用 flush 方法,即
$request->session()->flush();
,但是个人测试时发现,在登录成功进行赋值时,会显示如下的报错:
->>>>>>>> 【详细分析及解决方案,请参看附录(2)】
⑵. database 驱动方式
① . 可以使用 Artisan 命令 session:table 在数据库中创建表:
php artisan session:table
此时,建议将自动生成的文件,更改一下其中的一行代码:
②. 继续运行命令:
php artisan migrate
顺利执行的结果提示信息为:
若是不做前面的更改,很可能会出现下面的信息:
③. 驱动方式的配置
SESSION_DRIVER=database
- 此时进行页面的访问,数据表会被插入一条数据,且不同的浏览器打开网站时,都会增加一条:
【备注】:
- 相关 session 的处理代码,可通用,无需修改,此为优势
- 其实我就没明白,这个 session 表 的存在意义是如何的?并且字段 user_id 没有赋值
- 每次页面刷新或跳转,在时效内,都会进行更新,唯一不变的是 id 不变,待到有效期过后或者更换浏览器再增加新的记录.
- 个人理解,此 session 表 是框架在 database 驱动模式下自行访问的表,因为发现在调试环境下,页面进行跳转时会自行执行下面的查询,具体的还未找到解释,暂时理解为框架默许机制.
○ 附录
⑴. 参考文章
⑵.VerifyCsrfToken 影响
- 报错情况如下:
通过网上信息搜索,基本的观点就是
CSRF
的禁用限制,最简单的方式就是禁用CSRF
,可以参考文章(Laravel VerifyCsrfToken 报错解决),我选择了其中的一种.
上一篇: 2021-03-06
下一篇: 使用redis实现附近的人功能