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

7

我想使用 AppServiceProvider 类来分享 Session 值给所有视图。

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

但是,值为 null。有什么问题吗?在控制器中我设置它,它工作得很好。即使删除了 Session::put() 行,值仍然存在于会话中(显然)。

1个回答

10

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 中间件之后执行。


谢谢。虽然答案很好并且有效,但我的方法有误。想要在控制器之前显示值太早了,因为该值只会在稍后设置。在第一次加载时它将为空。也许视图组合器可以解决我的问题。 :) - Martin Fejes
1
是的,如果您在控制器中设置变量,在中间件的第一次调用(在设置之前)中它将为null。您还可以使用if ( !is_null($var) ) { //share it }将语句包含在中间件中,因此在第一次调用中您将不会共享任何内容...不知道是否符合您应用程序的需求。 - Moppo
1
谢谢,绝对有用的信息! :) - Martin Fejes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接