2015-11-25 13 views
6

AppServiceProviderクラスを使用してすべてのビューでセッション値を共有しようとしています。 boot()機能でLaravel - サービスプロバイダでセッション変数がnullです

は、私は言った:view()->share('key', Session::get('key'));

しかし、値がnullです。何が問題なの?コントローラーで私はそれを設定している、それは正常に動作します。 Session::put()行を削除しても、その値はまだセッションに残っています(明らかに)。 Laravelセッションで

答えて

7

は、このクラスによって処理されたミドルウェアで初期化されます。サービスプロバイダが起動されるとすべてのミドルウェアが実行されるため

\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

コントローラに変数を設定すると、ミドルウェアの最初の呼び出し(設定前)でnullになります。あなたはミドルウェアの中の文を 'if(!is_null($ var)){//共有}'で囲むこともできるので、最初の呼び出しでは何も共有しません。あなたのアプリのニーズ – Moppo

+1

ありがとう、間違いなく有用な情報! :) –

関連する問題