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. Android NDK 学习之Android.mk

    Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk  ...

  2. stm32和sd卡

    SD卡从容量上讲分两种:标准容量和大容量,最小的是标准容量,小于等于2G 其中的访问关系如下: SD卡分为两种模式:认证模式和传输模式,每一个模式包含着不同的状态,如下 以下主要讲其初始化过程: SD ...

  3. Android笔记(十三) Android中的基本组件——文本

    Android中常用的文本组件有 普通文本框(TextView)和编辑框(EditText)两种 EditText是TextView的子类,作用就是在界面上显示文本,区别是EditText允许用户编辑 ...

  4. 【TestNG】使用代码方式调用TestNG用例执行

    TestNG的用例除了直接运行之外,还可以使用代码来调用,这样做的好处在于我们可以将其嵌入其他代码中,来执行这些TestNG用例,方法如下: 1.直接调用用例类 范例:定义了两个测试用例类为Depen ...

  5. CentOS7.X+LAMP环境下安装zabbix4.X

    1.安装zabbix仓库 rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noar ...

  6. Log parser工具使用

    Windows日志存放于目录“C:\Windows\System32\winevt\Logs”中, 在目录中可以找到“System”.“Setup”.“Application”.“Security” ...

  7. 查看安装的centos的操作系统版本

    cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)

  8. es6中的Object.assign

    在写一些插件的时候,我们会经常遇到所传参数需要合并默认参数,并覆盖相同参数的情况,在jQuery中我们可以使用$.extend(),在原生中要想使用得自己封装, 但自从es6出现了Object.ass ...

  9. 模板引擎-vue中的模板如何被解析,指令如何处理

    模板是什么 <div id='app'> <div> <input v-model="title"/> <button v-on:clic ...

  10. DOORS 和Reqtify — 需求管理和需求追溯工具

    IBM Rational DOORS 可实现对整个产品的全生命周期需求管理,覆盖从需求.到设计以及测试阶段.是一款具有广泛使用的企业级专业需求管理工具.DOORS 可以将项目开发过程中产生的各级需求和 ...