2017-03-01 150 views
4

我有一個CalendarService的laravel項目,並將該服務注入到我的控制器中。在建築工我做這樣的事:Laravel依賴注入驗證::

CalendarService.php

/** @var Collection|Timelog[] */ 
private $timelogs; 

public function __construct() 
{ 
    $this->currentRoute = URL::to('/') . "/home"; 
    $this->timelogs  = Auth::user()->timelogs()->get(); 
    $this->currentDay = 0; 
} 

HomeController.php

/** @var CalendarService */ 
protected $calenderService; 

public function __construct 
(
    CalendarService $calendarService 
) 
{ 
    $this->calenderService = $calendarService; 
} 

而且我得到這個錯誤

調用一個成員函數timelogs ()null

關於這行代碼:

Auth::user()->timelogs()->get(); 

我已經使用了use Illuminate\Support\Facades\Auth;在我的服務

有誰知道是怎麼回事,這裏的任何幫助深表感謝!

在此先感謝!

+0

'Auth :: user()'empty表示用戶未登錄。您確定用戶已登錄嗎? –

+0

@Saumini是的,我確定:) –

+0

@Nicolas haha​​ha ja echt智障代碼ik heb een groot stuk gerefactored maar Laravel is echt wel retard ik mag ni eens simpele services da ik heb geschreven injecteren in mijn controller ... –

回答

0

您不能在最新版本的Laravel的構造函數中使用auth()Auth::,因此您需要直接在該方法中使用該邏輯。

public function someMethod() 
{ 
    $timelogs = Auth::user()->timelogs()->get(); 
1

的問題(如https://laracasts.com/discuss/channels/laravel/cant-call-authuser-on-controllers-constructor指出的)的事實驗證的中間件是不是在控制施工階段初始化。

可以代替做到這一點,但:

protected $calenderService; 

public function __construct() 
{ 
    $this->middleware(function ($request,$next) {   
     $this->calenderService = resolve(CalendarService::class); 
     return $next($request); 
    }); 
} 

替代

public function controllerMethod(CalendarService $calendarService) { 
    //Use calendar service normally 
} 

注:這是假設你能夠通過服務容器來解決CalendarService

+0

這可能會拋出方法中間件不存在的錯誤 –

+0

我不想在我的控制器中做到這一點順便說一句我想保持我的控制器儘可能乾淨 –

+0

@FrankLucas抱歉,我認爲第一個片段是控制器。替代方法是在控制器方法中注入'CalendarService'對象。更新。 – apokryfos