ホーム
Sponserd by↑転職したい人向け、ベンチャー企業の採用動画があります

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

こんばんは。まっつんです。

突然暑くなりましたね。

早速本日の議題

ログインの認証によって読み込むレイアウトを変えたい

そんなに難しい話ではないのですが、こういうタイトルで記事があったら便利だなと思って書いてます。

前提知識

通常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個ずつ潰して爆速プロトタイプ作れるように頑張っていきましょう!!