2015-11-25 65 views
6

我试图使用AppServiceProvider类与所有视图共享会话值。Laravel - 会话变量在服务提供商中为空

boot()功能我说:view()->share('key', Session::get('key'));

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

回答

7

在Laravel会议由本级处理的中间件进行初始化:

\Illuminate\Session\Middleware\StartSession::class 

当服务提供商正在启动,这个中间件还没有被执行,因为所有的中间件服务提供商后执行启动阶段

因此,而不是从服务提供商共享变量,你可以从那里创建一个中间件和共享会话变量,或者你可以在你的服务提供商使用的View Composer与回调:

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中间件

+0

之后执行。谢谢。虽然答案很好,而且有效,但我的方法出错了。希望在控制器过早之前显示该值,因为该值仅在稍后设置。在第一次加载时它将是空的。也许一个观点作曲家将解决我的问题。 :) –

+1

是的,如果您在控制器中设置了变量,则在第一次调用(在设置之前)该中间件时它将为空。你也可以用“if(!is_null($ var)){// share it}”把这个陈述包含在中间件中,所以在第一个调用中你不会共享任何东西......不知道它是否符合您的应用需求 – Moppo

+1

谢谢,绝对有用的信息! :) –