23
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コンストラクタでAuth::user()を取得する方法

Last updated at Posted at 2018-09-15

今更ではありますが、Laravel5.3よりAuth::user()がコンストラクタで取得できない仕様に変更されたみたいです。

ググって分かりづらかった部分をシンプルに書きます。

どういうこと?

通常のactionでは取得できる Auth::user()  が、コンストラクタの中では同じように記述しても取得できません。


class HogeController extends Controller
{
    private $user;

    public function __construct()
    {
        $this->user = \Auth::user();
        \Log::info($this->user);  // null
    }

    public function index()
    {
        \Log::info($this->user);  // null
        \Log::info(\Auth::user());  // 取得できる
    }
}

解決策

こんな感じで書いたらいいです。


class HogeController extends Controller
{
    private $user;

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

            // ココに書く
            $this->user = \Auth::user();

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

    public function index()
    {
        \Log::info($this->user);  //取得できる
    }
}

さいごに

(参考)
Laravel 5.3 コントローラのコンストラクタの重要な変更 ーララジャパン

作者は、ユーザー認証はクッキーやセッションがあってこそ成り立つものであり、それが入ってくるのはコントローラのメソッドにおいてのrequestの引数である。それゆえにrequestがないコンストラクタでその情報を取得するのはデザイン上「悪い」と。

推奨される方法が気になるところ。

23
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?