2016-09-18 65 views
1

因此,在找出Controller.php的構造器中的共享視圖不再有效,因爲它總是返回nullAuth::user(),我正在尋找一種不同的方式來做到這一點。

我只是尋找一種方法,將當前登錄用戶的$user變量傳遞給我所有的視圖。

上一頁方式這5.2及以下工作:

public function __construct() 
{ 
    view()->share('signed_in', Auth::check()); 
    view()->share('user', Auth::user()); 
} 

此不再起作用。我還能如何分享變量?

我曾嘗試:

public function __construct() 
{ 
    $this->middleware(function ($request, $next) { 
     $this->user = Auth::user(); 
     $this->signed_in = Auth::guest(); 

     view()->share('signed_in', $this->signed_in); 
     view()->share('user', $this->user); 

     return $next($request); 
    }); 
} 

但上面的代碼不起作用。它沒有「未定義的變量$用戶」錯誤加載頁面,但它只是顯示導航欄,然後沒有別的。由於某種原因,它也弄亂了網站CSS。

有沒有其他辦法可以做到這一點? 請幫忙。謝謝。

+0

默認情況下,Auth :: user()和Auth :: check()函數在視圖中可用,是否有某個特定的原因,您仍然希望使用'$ user'? – IzzEps

+0

那麼主要原因是我試圖將我的大型應用程序從5.2升級到5.3,並且它已經使用'$ user'來訪問當前用戶以使其易於讀取和寫入。做'$ user-> can('doSomething')比做'Auth :: user() - > can('doSomthing'')更容易。 –

+0

也許這個答案對你有幫助:https:// laracasts .com/discuss/channels/laravel/viewshare-not-working-in-51 /回覆/ 90831 – IzzEps

回答

2

我很容易地解決了這個問題。

在我\App\Http\Controllers\Controller.php

class Controller extends BaseController 
{ 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests; 

    private $user; 
    private $signed_in; 

    public function __construct() 
    { 
     $this->middleware(function ($request, $next) { 
      $this->user = Auth::user(); 
      $this->signed_in = Auth::check(); 

      view()->share('signed_in', $this->signed_in); 
      view()->share('user', $this->user); 

      return $next($request); 
     }); 

    } 

} 

通過將view()->share()在中間件的封閉,我能做到這一點。

0

是的,例如,您可以創建一個新的服務提供商,並將其註冊到您的config/app.php中,並將共享邏輯放在那裏。

讓我們開始創建一個新的服務提供商:

~/path/to/project$ php artisan make:provider ShareWithViewServiceProvider 

你應該看到消息Provider created successfully.

那麼你應該修改你的config/app.php,並添加您剛剛創建的新的服務提供商:

/* 
* Application Service Providers... 
*/ 

App\Providers\AppServiceProvider::class, 
App\Providers\AuthServiceProvider::class, 
// App\Providers\BroadcastServiceProvider::class, 
App\Providers\EventServiceProvider::class, 
App\Providers\RouteServiceProvider::class, 
App\Providers\ShareWithViewServiceProvider::class, // <-- This is the new entry 

然後在您的服務提供商的啓動方法中創建您的邏輯:

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class ShareWithViewServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     view()->share([ 
      'user' => auth()->user(), 
      'signedIn' => auth()->check(), 
     ]); 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // 
    } 
} 

請記住,auth()->user()將返回null如果您沒有登錄。

由於較短的解決方案,你可以把在app\Providers\AppServiceProvider.php份額邏輯,Laravel默認創建,並具有沒有任何東西(它在那裏供我們使用)。

+0

這不起作用,因爲auth() - > user()在服務提供者上返回null,即使用戶已經簽名因爲會話還沒有初始化 –

+0

是的,我的不好,然後把它放到一箇中間件中,確保在'\ Illuminate \ Session \ Middleware \ StartSession'中間件被初始化後包含這個新的中間件。 –

1

使用中間件回調,你所做的是一個正確的方法去做這件事,但你的任務是錯誤的。

使用這個代替:

$this->signed_in = Auth::check();