2016-12-22 9 views
0

dd(auth()->user());を実行して、laravelのコントローラのコンストラクタで認証されたユーザを取得しようとしています。私もそうように私のミドルウェアの一つで要求属性にユーザーIDを追加しました:laravelコントローラのコンストラクタでリクエスト属性を返すことができないのはなぜですか?

$request->attributes->add(['auth_user_id' => $user_id]); 

を、私は私のコントローラの構造方法でdd($request->get('auth_user_id')を行う場合でも、私はnullを取得します。しかし、私がテストルートで同じことをしたとき、どちらのdump文もうまく動作し、ユーザーまたはユーザーIDのどちらかを返すことができます。

なぜ私はコントローラの構築方法でこれらを取得できませんか?私は、同じユーザIDと認証ユーザを、リクエストが送信されるコントローラメソッドで取得することさえできます。ちょうど構築方法ではありません。私は何が欠けていますか?

+1

コントローラによって、このリンクを参照してください。ミドルウェアが実行される前にhttps://github.com/laravel/framework/blob/5.2/src/Illuminate/Routing/ControllerDispatcher.php#L50 –

+0

これを回避する方法を提案できますか? – Rohan

+0

確かです。コンストラクタでは使用しないでください。あなたはとにかくそこにそれを必要としません。 –

答えて

0

これは、クラスのオブジェクトが初期化され、その時点でログインしていないときに呼び出されたコンストラクターメソッドで、auth_user_idを取得できないためだと思います。

しかし、あなたははLaravel 5.3で

1

をauth_user_id取得することができますなぜミドルウェアが初期化されている場合、この変更が導入されたの通常の方法の場合には、それらは、コンストラクタメソッドの後に呼び出され、そしてあなたがその中に記録されますコントローラクラスが構築された後つまり、コントローラの__construct()メソッドでは、アプリケーションの重要なミドルウェア(Auth --specifically Auth::user())を使用できません。

このドキュメントを参照してください。 https://github.com/laravel/docs/blob/5.3/upgrade.md#session-in-the-constructor

編集

あなたはあなたが必要なものを実装することができますこの方法です。

どのauth/sessionものが呼ばれると、コントローラのプロパティとして設定することができるように、これは、コントローラのコンストラクタで閉鎖ミドルウェアを登録できるようになります:インスタンス化されている

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

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

Controller closure middleware - JosephSilber

関連する問題