2017-05-10 31 views
2

我需要能夠將數據傳遞到所有視圖當用戶登錄訪問AppServiceProvider中的用戶?

這裏是我的AppServiceProvider目前的樣子:

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     if (Auth::check()) 
     { 
      View::share('key', 'value'); 
     } 
    } 
} 

然而,數據永遠不會傳遞給視圖因爲我不能在AppServiceProvider中使用Auth(出於某種原因),所以if語句條件永遠不會被滿足。

previous solution我才發現,我試着這樣做:

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     View::composer('*', function ($view) 
     { 
      if (Auth::check()) 
      { 
       View::share('key', 'value'); 
      } 
     } 
    } 
} 

這個工作,但問題是,每當一個視圖呈現封閉被調用。例如,如果我的刀片模板包含3個其他刀片模板(它所做的),則上面的關閉將被調用4次。 Explained further here

那麼如何在AppServiceProvider中正確訪問用戶呢?

+0

看起來,當服務提供者被加載時,認證機制尚未設置。唯一可以考慮的解決方法是爲「Illuminate \ Auth \ Events \ Login」事件添加一個處理程序,該事件將會話的密鑰和值存儲在會話中。然後,您只需將其從視圖中的會話中取出即可。 – user3158900

回答

0

Auth方法不能在AppSeviceProvider的直接上下文中工作的原因是Auth系統尚未加載。在定義的閉包中,Auth系統將可用,因爲它在執行閉包之前總是加載。因此,問題在於使用視圖作曲家的方式。

composer方法只接受一個數組(或字符串)的視圖標識符和一個*。因此,下面的選項:

定義多個視圖

View::composer(['about', 'contact'], function ($view) 
{ 
    if (Auth::check()) 
    { 
     View::share('key', 'value'); 
    } 
} 

定義一個視圖,使這個主父視圖所有

您可以在相關的頁面,例如,定義一個main.blade.php並用所有相關視圖擴展此視圖。

@extends('main') 

而就共享main觀點:

View::composer('main', function ($view) 
{ 
    if (Auth::check()) 
    { 
     View::share('key', 'value'); 
    } 
} 

還有其他可用選項,例如過濾器或父控制器。優秀的答案here