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

会话总是返回 null facebook php sdk

Laravel - 服务提供者中的会话变量为空

Afnetworking 返回 null json 尽管它是有效的

Laravel 5:404 路线上的会话

如何在 Laravel 中设置会话超时?