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

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

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

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

【问题讨论】:

    标签: php laravel session laravel-5 laravel-5.1


    【解决方案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 } 将语句括在中间件中,因此在第一次通话中您不会共享任何内容...不知道它是否满足您应用的需求
    • 谢谢,绝对有用的信息! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2015-05-12
    • 2016-12-21
    • 2015-10-24
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多