laravel8「ログインユーザー+任意の条件」で指定ページに飛ばしたい
ログイン後、絶対に登録させたい項目があるとき…など(※ミドルウェア(middleware)が絡む)
作成日:2022-12-01, 更新日:2023-09-20
私の環境
WIN+Docker+Ubuntuでlaravelを使うための作業メモ
メモ
コントローラの「__construct()」の中で対応しようとしたら「__construct()」の中で「Auth::user()」が使えないということが発覚
「__construct()」の中で使う方法もあるけど任意のページに飛ばす方法がよく分からず…思い出したのが以前に作業した「laravel8 任意のユーザーを強制ログアウトさせる」。
基本
「laravel8 任意のユーザーを強制ログアウトさせる」と基本は同じ
→このファイルに条件を追加するのが良いと思うけど、勉強がてら別途作成
処理の流れ
- ミドルウェアの作成
- カーネルに登録
- 確認
ミドルウェアの作成
ファイルの作成
▼artisanコマンドでミドルウェアのファイル作成
$ ./vendor/bin/sail php artisan make:middleware CheckRequiredRegister
→「app/Http/Middleware/CheckRequiredRegister.php」が作られる
ファイルの修正
▼「app/Http/Middleware/CheckRequiredRegister.php」にuse追加
use Illuminate\Support\Facades\Auth;
▼「app/Http/Middleware/CheckRequiredRegister.php」の「handle()」
public function handle(Request $request, Closure $next) { if( auth()->check() ){ $user_id = auth()->user()->id; ~ $user_idから好きなデータを取得 ~ if ( ~ ダメな条件 ~ ) { return redirect(~ 飛ばしたい場所 ~); } } return $next($request); }
→飛ばし先によっては無限ループになるので注意する
無限ループになった例
▼ログイン後、「設定ページ」より諸々登録させたいので登録が無ければ「設定ページ」に飛ばそうとした
public function handle(Request $request, Closure $next) { if( auth()->check() ){ $redirect_url = url('setting'); // 「設定ページ」に飛ばす $user_id = auth()->user()->id; ~ $user_idから好きなデータを取得 ~ if ( ~ ダメな条件 ~ ) { return redirect($redirect_url); } } return $next($request); }
→「設定ページ」に飛んでくれるけど、「設定ページ」でもこのミドルウェアが実行されるので再度「設定ページ」にリダイレクト。これで無限ループの完成。
無限ループの回避
「設定ページ」のとき「チェックしない」ってのが必要
▼今回はURLで条件分岐
public function handle(Request $request, Closure $next) { if( auth()->check() ){ $redirect_url = url('setting'); // 「設定ページ」に飛ばす if ( $request->url() != $redirect_url ) { // 現在のページと飛ばし先が異なるときだけチェック $user_id = auth()->user()->id; ~ $user_idから好きなデータを取得 ~ if ( ~ ダメな条件 ~ ) { return redirect($redirect_url); } } } return $next($request); }
→今回は単純に「!=」としたけど「strpos()」だったり、複数のURLの確認だったりとケースバイケース
※ルーティングにもよるけどログアウトが出来なくなるかもしれない → ログアウトのときもチェックしないようにする
カーネルに登録
▼「app/Http/Kernel.php」に追加
~ 省略 ~ protected $middlewareGroups = [ 'web' => [ ~ 省略 ~ \App\Http\Middleware\CheckRequiredRegister::class, ], 'api' => [ ~ 省略 ~ ], ]; ~ 省略 ~
※状況に応じて「api」のほうに追加したり、違うトコに記載したりする
「登録してね」的なメッセージを表示させたい
- ミドルウェア側でセッションセット
- リダイレクト先でセッション取得+出力
ミドルウェア側でセッションセット
▼「app/Http/Middleware/CheckRequiredRegister.php」の「handle()」
public function handle(Request $request, Closure $next) { ~ 省略 ~ return redirect(~ 飛ばしたい場所 ~)->with(array('ErrMessage'=>'登録してね')); ~ 省略 ~ return $next($request); }
リダイレクト先でセッション取得+出力
コントローラ
~ 省略 ~ use Illuminate\Http\Request; ~ 省略 ~ public function xxx(Request $request){ $viewData = array( 'ErrMessage' => $request->session()->get('ErrMessage', ''), ); return view('〇〇〇', $viewData); } ~ 省略 ~
ビュー
~ 省略 ~ @if($ErrMessage!='') {{ $ErrMessage }} @endif ~ 省略 ~
確認
条件にあうログインユーザーでブラウザからアクセスして、対象ページにリダイレクトされたら成功