2017-03-01 12 views
4

私はCalendarServiceでlaravelプロジェクトを持っており、そのサービスを私のコントローラに注入します。建設業者では私はこのような何か:Laravel dependecy injection Auth ::

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へ

コールを取得します()on null

このコード行について

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

私は、誰もが任意のヘルプははるかに高く評価され、ここで何が起こっているか知っています私のサービス

use Illuminate\Support\Facades\Auth;を使用していました!

ありがとうございます!

+0

'Auth :: user()'が空であるということは、ユーザーがログインしていないことを意味します。あなたはユーザーがログインしていることを確認していますか? –

+0

@Sauminiうん、確信しているよ: –

+0

@ニコラスハハハは、遅れたコードが遅れてしまったコードを覚えています。Laravelは、遅れて遅れています。これは、コントローラのインジェクションをシミュレートしています... –

答えて

0

auth()またはAuth::をLaravelの最新バージョンのコンストラクタに使用することはできません。このロジックをメソッドで直接使用する必要があります。

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

問題は(https://laracasts.com/discuss/channels/laravel/cant-call-authuser-on-controllers-constructorで指摘したように)認証ミドルウェアは、コントローラ構築フェーズ中に初期化されていないという事実です。

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

protected $calenderService; 

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

オルタナティブ:

あなたは代わりにこのかかわらを行うことができますこれは、サービスコンテナを経由してCalendarServiceを解決することができるしていることを前提としています。

+0

これはおそらくメソッドミドルウェアが存在しないというエラーをスローする –

+0

私は自分のコントローラでこれをしたくありませんbtw私はコントローラをできるだけきれいに保ちたい –

+0

@FrankLucas申し訳ありません、私は最初のスニペットがコントローラのものだと思いました。代わりに、コントローラメソッドに 'CalendarService'オブジェクトを注入する方法もあります。更新しました。 – apokryfos