2015-11-25 2 views
6

Я пытаюсь разделить значение сеанса со всеми представлениями, используя класс AppServiceProvider.Laravel - переменная сеанса имеет значение null в Провайдере

В функции boot() я сказал: view()->share('key', Session::get('key'));

Но значение null. В чем проблема? В контроллере я настраиваю его, он работает нормально. Даже после удаления строки Session::put() значение все еще находится в сеансе (очевидно).

ответ

7

В 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'));  
    }); 
} 

Это будет работать, так как обратный вызов будет вызван до мнения составлены, когда промежуточное уже выполнено, поэтому сессия будет Availabe

В целом, обратите внимание на порядок выполнения вашего промежуточного программного обеспечения: если вы хотите получить доступ к сеансу из промежуточного программного обеспечения, которое должно выполняться после промежуточного ПО StartSession::class Laravel

+0

Спасибо. Хотя ответ хороший и он работает, в моем подходе произошла ошибка. Желание показать значение до того, как контроллер будет слишком скоро, потому что значение устанавливается только позже. При первом загрузке он будет пустым. Может быть, композитор представления решит мою проблему. :) –

+1

Да, если вы установите переменную в контроллере, в первом вызове (перед ее настройкой) промежуточного слоя она будет равна нулю. Вы также можете заключить статут в промежуточном программном обеспечении с помощью 'if (! Is_null ($ var)) {// share it}', поэтому при первом вызове вы ничего не расскажете ... не знаю, встречается ли это потребности вашего приложения – Moppo

+1

Спасибо, определенно полезная информация! :) –

Смежные вопросы