今更ではありますが、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がないコンストラクタでその情報を取得するのはデザイン上「悪い」と。
推奨される方法が気になるところ。