Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题)

一、总结

一句话总结:

Laravel 会首先收集需要写入 Session 的所有数据,并在用户的代码执行后自动调用 session()->save() 方法写入这些数据。这里调用了 dd() 直接终止了整个框架,值根本没有存进去,其它的方法当然取不到了。

二、Laravel 中 Session 的使用问题

转自或参考:Laravel 中 Session 的使用问题
https://blog.csdn.net/mrzhouxiaofei/article/details/86302198

 

HTTP 协议是无状态的协议,两个请求之间是没有任何关联的,为了让服务器保存用户的状态信息,所以引入了 Session 的概念。

在 Laravel 中使用 Session 有两种方式,通过 Request 实例或者通过全局辅助函数,我一般使用全局辅助函数,像下面这样

// 存储数据到 session
session(['user' => 'mrzhouxiaofei']); // 从 session 获取数据
$value = session('user');

前段时间,在 Laravel 中使用 Session,类似下面这样

public function setSession() {
session(['user' => 'mrzhouxiaofei']);
dd(session('user'));
} public function getSession() {
dd(session('user'));
}

首先,访问方法 setSession() 存储数据到 session,同时使用全局辅助函数 dd() 将刚存进 session 的值显示出来,这里是没问题的。之后访问 getSession() 将 session 里的值显示出来,这里有问题,刚存进 session 的值并没有显示出来。

之前在 Laravel 中使用 Session 并没有出现这样的问题,我在网上搜了一圈,没找到结果。翻了 Laravel 的文档,找到了下面的一段话。

Laravel 并没有使用 PHP 内置的 Session 功能,而是自己实现了一套更加灵活更加强大的 Session 机制,核心逻辑请参考 Illuminate\Session\Middleware\StartSession 这个中间件,因此在 Laravel 应用中不要试图通过 $_SESSION 方式去获取应用的 Session 值,这是徒劳的。
内容来自:Laravel 学院

Laravel 中的 Session 是自己实现的,没有使用 PHP 原生的那套机制,可是你即使自己实现,一个会话期间,共享 Session 是肯定的啊,还是没有解决问题。

尝试了几次之后,发现方法 setSession 中的 dd() 函数删掉,Session 就正常了。。。

原来是 dd() 函数搞的鬼。知道原因之后,通过关键字 Laravel Session dd() 一下就搜出来好多结果,随便点一个就找到原因了。

Laravel 5.4 session is not being set if dd method is used

有人回复说:dd() 表示 “dump & die”,die() 函数在 dd() 实现中被调用,它会立即结束框架,并且不允许 Laravel 完成请求并保存 Session。如果想这样用,可以使用 dump() 代替 dd()。

// dd() 实现
function dd(...$vars)
{
foreach ($vars as $v) {
VarDumper::dump($v);
} die(1); // 调用了 die()
} // dump() 实现
function dump($var, ...$moreVars)
{
VarDumper::dump($var); foreach ($moreVars as $v) {
VarDumper::dump($v);
} if (1 < func_num_args()) {
return func_get_args();
} return $var;
}

原因找到了,Laravel 会首先收集需要写入 Session 的所有数据,并在用户的代码执行后自动调用 session()->save() 方法写入这些数据。这里调用了 dd() 直接终止了整个框架,值根本没有存进去,其它的方法当然取不到了。

所以开始的问题可以像下面这样解决

// 使用 dump() 代替 dd()
public function setSession() {
session(['user' => 'mrzhouxiaofei']);
dump(session('user'));
} public function getSession() {
dump(session('user'));
} // 或者在 dd() 之前显示的调用 session()->save()
public function setSession() {
session(['user' => 'mrzhouxiaofei']);
session()->save();
dd(session('user'));
} public function getSession() {
dd(session('user'));
}

Laravel 中的 Session 是自己实现的,有这个问题,那原生 PHP 的 Session 有这个问题吗?试了一下

// setSession.php
<?php
session_start();
$_SESSION['user'] = 'mrzhouxiaofei';
die(); // getSession.php
<?php
session_start();
echo $_SESSION['user'];

首先访问文件 setSession.php,然后访问 getSession.php,看到值被输出,看来 PHP 的原生 Session 机制并没有这个问题。

原文链接:Laravel 中 Session 的使用问题

 

Laravel 中 Session 的使用问题(dd()导致laravel中session取值问题)的更多相关文章

  1. loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式

    loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...

  2. JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率

    大家好,又见面了. 在JAVA做前后端分离的项目开发的时候,服务端需要提供接口文档供周边人员做接口的对接指导.越来越多的项目都在尝试使用一些基于代码自动生成接口文档的工具来替代由开发人员手动编写接口文 ...

  3. javascript中json对象json数组json字符串互转及取值

    今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...

  4. Java中基本数据类型byte,short,char,int,long,float,double 取值范围

    部分内容转自:java 彻底理解 byte char short int float long double 首先说byte: 这段是摘自jdk中 Byte.java中的源代码: /** * A co ...

  5. 2.RF中scalar,list和dict变量的定义和取值

    $:定义scalar变量:@定义list变量:&定义dict变量: $还用来取值,包含scalar, list和dict变量,如下example所示 1.定义scalar变量:set vari ...

  6. C# 与数据库中字段类型 Int16(short), Int32(int), Int64(long)的取值范围、区别 。string长度

    一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等 ...

  7. c# winform Chart Pie 中若X轴数据为字符串时,#VALX取值为0

    https://q.cnblogs.com/q/83848/ 在winform程序中用自带的Chart进行画图表时,若画饼图,其中X轴数据为字符串,这时候如果想设置Label值的格式为#VALX:#V ...

  8. java中short、int、long、float、double取值范围

    一.分析基本数据类型的特点,最大值和最小值.1.基本类型:int 二进制位数:32包装类:java.lang.Integer最小值:Integer.MIN_VALUE= -2147483648 (-2 ...

  9. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

随机推荐

  1. 【实战】SQL注入小脚本

    1.ORACLE布尔型盲注 import urllib import urllib2 import requests payloads = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ' ...

  2. phpstom激活

    phpstom官网:https://www.jetbrains.com/phpstorm/download 激活方法:激活时选择License server 填入http://idea.imsxm.c ...

  3. String.getBytes()方法中的中文编码问题

    得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! byte[] a= "中".getBytes() String.getBytes(Strin ...

  4. java - day016 - IO续(输入输出), 手写双向链表

    课程回顾 对象的创建过程 类加载 加载父类,父类的静态变量分配内存 加载子类,子类的静态变量分配内存 父类静态变量赋值运算, 和静态初始化块 子类静态变量赋值运算, 和子类初始化块 创建对象 创建父类 ...

  5. javascript reduce 前端交互 总计

    sum(){ return this.products.reduce((total,next)=>{ return total + next.price * next.aumout},0) } ...

  6. Entity Framework的一个坑

    由于业务需要写了一个批量数据导入工具.中间踩了一个坑 问: 1. SaveChange 实体A 发生pk冲突,异常了.2.记录日志3.不让退出程序,继续处理下一个实体4.Add新的实体B5.再次调用S ...

  7. python 实现定时任务

    需求: 想实现 每周一到周五下班钉钉打卡提醒,每周四发周报提醒 使用了二种方法实现 一:apscheduler,代码如下 import json,requests,datetime from apsc ...

  8. 03_Tutorial 3: Class-based Views 基于类的视图(CBV)

    1.CBV 0.文档 https://q1mi.github.io/Django-REST-framework-documentation/tutorial/3-class-based-views_z ...

  9. [Javascript] Construct a Regex to Match Twitter Mentions with Regexr

    regexr is a powerful tool for debugging existing regexes and creating new ones. In this lesson, we'l ...

  10. webpack 4 的 proxy

    第一种 接口有api的 setupProxy.js const proxy = require('http-proxy-middleware'); module.exports = function( ...