Laravel

【Laravel】認証しているAuthのguardの種類によって読み込むlayoutsを変えたい

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

はじめに

ログイン認証の guard によって読み込む layouts を変える方法についてまとめてみました。

例えば、マルチ認証を実装している時に、同じ blade で表示したいけど、Header などの共通レイアウトだけ違うみたいなページを作成する時に使うイメージです。

前提知識

通常 middleware→controller→blade といった順番で読み込んでいって、blade で html を書いていくと思います。

blade は@で php を書いたり出来て便利なのですが、フレームワークなので、ある程度型が存在します。

例えばこれです。

@extends("layouts.app")

今回の主役です。

この子は Blade が呼び出されると真っ先に読まれます。

真っ先です。

何も調べずやってみた方法(失敗例)

@if(Auth::guard('user'))
 @extends('layouts.app')
@else
 @extends('layouts.admin')
@endif

user でログインしていたら app というレイアウトを読み込んでくださいね。という指示を書いたつもりだった。

最初に言ったとおり、@extends は真っ先に呼ばれるので、実際に

@extends('layouts.app')
@extends('layouts.admin')

@if
@else
@endif

という順番だったので何も制御してませんでした。

レイアウトが 2 つ呼ばれてびびったゴールデンウィークとなりました。

成功した例

コントローラーで呼び出すレイアウトの名前を指定してあげます。

つまり、ユーザーなら「layouts.app」という名前、アドミンなら「layouts.admin」という名前を変数で渡してあげればよい、ということです。

//コントローラー

public function index()
{
 if(Auth::guard('user')){
 $layout = 'layouts.user';
 } elseif(Auth::guard('admin')){
 $layout = 'layouts.admin';
 } else {
 return redirect()->route('home');
}
 return view('index',['layout'=>$layout]);
}

//Blade

@extends($layout)

はい!できました!

コントローラーには、「もしユーザーでログインしたら」「もしアドミンなら」「それ以外は」を書いてみました。

普通に文字列を渡して、Blade の extends 内で使ってあげればよいということですね。

単純明快!

まとめ

Laravel は超便利ですけど、読み込み順や型を覚えるのが結構大変なので、1 個ずつ潰して爆速プロトタイプ作れるように頑張っていきましょう!!

感想・苦情は TwitterDM にご連絡ください。