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
~ 省略 ~
確認
条件にあうログインユーザーでブラウザからアクセスして、対象ページにリダイレクトされたら成功