6
我试图使用AppServiceProvider
类与所有视图共享会话值。Laravel - 会话变量在服务提供商中为空
在boot()
功能我说:view()->share('key', Session::get('key'));
但是,该值是null
。可能是什么问题?在控制器中,我正在设置它,它工作正常。即使删除Session::put()
行后,该值仍然在会话中(显然)。
我试图使用AppServiceProvider
类与所有视图共享会话值。Laravel - 会话变量在服务提供商中为空
在boot()
功能我说:view()->share('key', Session::get('key'));
但是,该值是null
。可能是什么问题?在控制器中,我正在设置它,它工作正常。即使删除Session::put()
行后,该值仍然在会话中(显然)。
在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
中间件
之后执行。谢谢。虽然答案很好,而且有效,但我的方法出错了。希望在控制器过早之前显示该值,因为该值仅在稍后设置。在第一次加载时它将是空的。也许一个观点作曲家将解决我的问题。 :) –
是的,如果您在控制器中设置了变量,则在第一次调用(在设置之前)该中间件时它将为空。你也可以用“if(!is_null($ var)){// share it}”把这个陈述包含在中间件中,所以在第一个调用中你不会共享任何东西......不知道它是否符合您的应用需求 – Moppo
谢谢,绝对有用的信息! :) –