今日はとても基本的な話に戻るのですが・・・・・・
まず今日一番の収穫は
コンストラクタは戻り値を出せないということですね。
今作ってるプロダクトは、ログインページがトップページにある関係上、デフォルトの認証システムが使いづらいんですよね。なので自分でコントローラーを組み立ててるんですけど
手を抜いて要ログインの操作はコンストラクタでログインチェックして、ダメだったらリダイレクト・・・・・・っていうのをしていたんですね。
ここで余裕ぶっこいて特にテストとかしなかった自分が悪いんですが、
昨日のパスワードリセットをなんとかしている過程で、未ログイン状態でもアクセスできてしまうことに気づいたんですね。
アクセスできるっていっても必要な情報が取得できないので特に致命的なエラーというわけではないですが、何も表示されないページが出たり、設定画面はエラーで止まるとか弊害は色々あるんですよ。そりゃ、コンストラクタでリダイレクトさせるようなページですから、ユーザー情報ありきでコーディングしてますしね。
これに対する解決策としては、コントローラーメソッド全てに認証チェックを入れることなんですが
どう考えても非効率的です。
そこで真っ先に思い当たるのが
ミドルウェアですね。
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/');
}
}
return $next($request);
}
authというミドルウェアを用いれば解決できそうなので試してみるんですけど、Authからうまく情報が受け取れず、これがまた上手く行かないんですよ。何をやってもNULLが返ってくるのです。
ううーん???と思ってまたハマっていたんですけど、そういえばと思い出して試したことが一つ。
Route::group(['middleware' => ['web','auth']], function () {
///
}
これです。この
"web"というミドルウェアが必要なんじゃないかと。
このミドルウェアの存在意義に関しては謎なんですけど、
これがないとcsrf_tokenが取得できないなどの弊害が発生したりするんですよね。
もしかしたらその類なんじゃないか・・・・・・ということで、上のように付け足してみると
あっさり上手く行きました。
このwebというミドルウェアは、まぁもともとあったのかも知れませんけどLaravel5.2になり急に出てきたものなんですよね。
こいつの存在意義に関してはドキュメントでも触れられておらず、なかなか誰も教えてくれないんですが、とりあえず使っておくべきもの・・・・・・として解釈した方が良いのだろうか・・・・・・。わからん。
あと、これまた昨日のパスワードリセットの話に戻るんですが、これデフォルトのシステムを使うと
ログイン状態だと強制的にトップページにリダイレクトされるんですね。
フレームワークの中身をちょろっと覗いてみても該当する場所が見つからなかったんで、諦めて自前で実装することになります。
といっても、仕組み自体は単純です。要するにランダム文字列を生成して、DBに登録させつつその文字列をURLに連結させ、それをメール送信すれば良いだけの話ですからね。
で、アクセスされたら新しいパスワードを設定してもらうページに飛んでもらう、と。そんなに難しい話ではないです。
時間を設定したかったら、DBにカラムを追加すれば余裕ですね。自分で作ったほうが早かったかも知れませんねこれ・・・・・・。(笑)