laravel 会话返回 null 尽管设置它
Posted
技术标签:
【中文标题】laravel 会话返回 null 尽管设置它【英文标题】:laravel session returning null inspite of setting it 【发布时间】:2012-11-25 12:03:18 【问题描述】:只是原生php中的一个简单函数
protected function some_function()
session_start();
if(!isset($_SESSION['a']))
$_SESSION['a'] = 'some value';
return true;
else
return $_SESSION['a'];
在第一次运行时,它将按预期返回 bool(true) 和 "some value"
。
对 laravel 会话应用同样的,
protected function some_function()
$a = Session::get('abc');
if(is_null($a))
Session::put('abc', 'some value');
//return Session::get('abc');
return true;
else
return $a;
按照逻辑,在第一次运行时,$a 将是 null
。然后将"some value"
放入abc
键中并按预期返回bool(true)。
但是在随后的访问中,Session::get('abc')
每次都返回 null。因此每次尝试都返回 bool(true)。
我认为可能是会话没有正确写入,所以我在设置后立即检查了获取键值。
通过注释掉上面代码中的行,它返回我在Session::put('abc')
中输入的任何值。 所以写入数据没有错误。
问题这里试图检索值总是返回null
,尽管我在第一个请求之后设置了。
我错过了什么吗?
编辑
使用数据库作为驱动程序,会话不会保存在数据库中。没有错误输出。文档中描述的会话表模式的数据库实现是正确的。
【问题讨论】:
您是否正确设置了会话配置?例如,是否设置了应用程序密钥? laravel.com/docs/session/config @nerdklers 我现在正在使用file
驱动程序。应用程序密钥已设置。
你还有这个问题吗,因为我也有类似的问题
@mattl 不。我无法解决它,不得不创建自己的库。但是最新版本没有它并且工作得很好。需要考虑的一件事。在会话中放置一些东西时,不要过早退出。假设如果我在会话中放入一些东西并调用dd()
,它将无法保存。如果您确实需要保存,则需要在输入值之后但在退出之前手动调用Session::save()
。让我知道是否难以理解。
我还发现使用带有Session::get()
方法的默认响应已经取代了其他正在起作用的 put 方法的情况。
【参考方案1】:
在通过许多论坛解决相同的问题后,我通过将会话驱动程序设置为数据库来解决它。
'driver' => 'database',
并在数据库中创建表
CREATE TABLE `sessions` (
`id` varchar(40) NOT NULL,
`last_activity` int(10) NOT NULL,
`data` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
【讨论】:
【参考方案2】:试试这个 sn-p。未经测试,但很确定它可以工作。
if(Session::has('abc'))
return Session::get('abc');
else
Session::put('abc', 'some value');
return true;
【讨论】:
是的。这将作为Session::has
每次都返回false
作为密钥工作。但这意味着,每次我需要检索它时,我都必须写入该值。违背了会话的目的。不是吗?
Session::has('abc')
应该返回 true,如果存储了该键的值(因此使用存储的 session-var)。
正是我在实现它时期望返回的。但在实践中,它返回错误。因此密钥获得默认的null
。为了简单起见,没有机会在其他地方破坏它,因为它是唯一使用会话的函数。
我将 sn-p 简化了一些。这应该可以正常工作,否则 laravel 会话配置有问题。还要确保“某些值”字符串不为空。
是的。有用。但这里的问题是,session::has
即使设置了它也会返回 false。会话应该编写一次,然后通过调用它来检索它。在调用它之前不要每次都写。它现在的行为类似于局部变量,而不是会话变量。以上是关于laravel 会话返回 null 尽管设置它的主要内容,如果未能解决你的问题,请参考以下文章
尽管流返回对象,但 Flutter StreamProvider 返回 null