2015-05-09 79 views
5

我需要將當前登錄的用戶共享到所有視圖。我試圖在AppServiceProvider.php文件中使用view->share()方法。如何在Laravel 5的所有視圖中共享Auth :: user?

我有以下:

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

use Illuminate\Contracts\Auth\Guard; 


class AppServiceProvider extends ServiceProvider { 


    public function boot(Guard $guard) 
    { 
     view()->share('guard', $guard); 
     view()->share('user', $guard->user()); 
    } 

    //.. 
} 

然而,當我打了一個視圖(登錄之後),user變量爲空。奇怪的是,$guard->user(受保護的屬性,不是公共方法user())不是。我得到的輸出如下:

enter image description here

注特派守>用戶變量填充,但用戶變量爲空。

+0

如果調用'check()'和'getUser()'方法,你會得到什麼? –

+0

'check()'返回'false'和'getUser()'返回NULL' – Chris

+0

我覺得它的「檢查」太早了,但顯然'boot'方法假設等待所有服務已經註冊並且權限去 – Chris

回答

9

最好使用View Composer來做這個。

在你ComposerServiceProvider在boot()

view()->composer('*', 'App\Http\ViewComposers\GlobalComposer'); 

在HTTP/ViewComposers創建一個類GlobalComposer,並創建功能:

public function compose(View $view) 
{ 
    $view->with('authUser', Auth::user()); 
} 

http://laravel.com/docs/5.0/views#view-composers

+0

我認爲視圖作曲家是非常強大的東西,但(a)我想使用注入的Guard,而不是門面Auth,(b)'view() - > share'用例本質上就是我用它..雖然,對於這個項目的其他部分,我將使用視圖作曲家。 – Chris

+0

你能分享一下你想使用注入式護衛與立面的具體原因嗎? –

+0

更正 - 經過進一步研究,你是對的。這是由於這個「bug」https://github.com/laravel/framework/issues/6130這個答案解釋它比我更好:http://stackoverflow.com/a/29817941/614112 – Chris

4

就可以解決這個問題,而無需創建一份文件。

將這些代碼添加到您的ServiceProvider的boot()動作,就是這樣。

view()->composer('*', function($view){ 
    $view->with('user', Auth::user()); 
}); 

來源也一樣:http://laravel.com/docs/5.0/views#view-composers

通配符搜索作曲家

+0

很好的解決方案。謝謝! – Marcel

+0

這是更容易和更好的解決方案.. –

相關問題