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 - 服务提供者中的会话变量为空的主要内容,如果未能解决你的问题,请参考以下文章