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

Posted

技术标签:

【中文标题】Laravel - 服务提供者中的会话变量为空【英文标题】:Laravel - Session variable is null in Service Provider 【发布时间】:2016-02-28 05:56:06 【问题描述】:

我正在尝试使用 AppServiceProvider 类与所有视图共享一个 Session 值。

boot()函数中我说:view()->share('key', Session::get('key'));

但是,值是null。可能是什么问题?在我设置的控制器中,它工作正常。即使删除Session::put() 行后,该值仍在会话中(显然)。

【问题讨论】:

【参考方案1】:

在 Laravel 中,会话在由此类处理的中间件中初始化:

\Illuminate\Session\Middleware\StartSession::class

当服务提供者启动时,这个中间件并没有被执行,因为所有的中间件都是在服务提供者启动阶段之后执行的

因此,您可以创建一个中间件并从那里共享会话变量,而不是从服务提供者共享变量,或者您可以在服务提供者中使用带有回调的视图编辑器:

public function boot()

    view()->composer('*', function ($view) 
    
        //this code will be executed when the view is composed, so session will be available
        $view->with('key', \Session::get('key') );    
    );  

这将起作用,因为回调将在视图组合之前调用,当中间件已经执行时,会话将可用

一般来说,要注意中间件的执行顺序:如果你想从中间件访问会话,应该在 Laravel 的 StartSession::class 中间件之后执行

【讨论】:

谢谢。尽管答案很好并且有效,但我的方法存在错误。想要在控制器过早之前显示该值,因为该值只是稍后设置的。在第一次加载时,它将是空的。也许视图作曲家会解决我的问题。 :) 是的,如果您在控制器中设置变量,在中间件的第一次调用(设置之前)它将为空。您也可以使用if ( !is_null($var) ) //share it 将语句括在中间件中,因此在第一次通话中您不会共享任何内容...不知道它是否满足您应用的需求 谢谢,绝对有用的信息! :)

以上是关于Laravel - 服务提供者中的会话变量为空的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - 会话不会在路由更改中持续存在

如何为Laravel中的每个会话设置不同的到期时间?

Laravel Blade 中的全局变量

本地 xampp 服务器上的空会话

使用ajax调用的角度保存变量到laravel会话不起作用

Spring启动 - 会话作用域组件的setter不能使用单件服务 - 字段为空