2015-11-25 64 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

謝謝,絕對有用的信息! :) –