今回は、Laravelサイトでログイン画面を表示させた後、元いたページにリダイレクトバックする方法を解説します。
例えば、こんなシチュエーション。
知恵袋サイトを作ってるとして、閲覧者が回答フォームに入力するには、
ログイン必須にしたいとします。
なので↑こんな感じの入力フォームが表示されるのはログイン後だけにして、
ログインしてない時は↓
こんな感じにボタンだけ表示し、ボタンをクリックすると、ログイン画面に飛び、ログインが完了すると、このページに戻ってきて、入力フォームが表示されるようにしたいとします。
この特定ページ→ログイン画面→元いたページとリダイレクトバックをLaravelサイトで実装する方法を解説します。
Laravelでログイン後、元いた同じページにリダイレクトバックする方法
まず、全体の手順としては、
- 現在URLの取得コードをコントローラーに追記
- ブレードに現在URL送信フォームを設置
- リダイレクト専用コントローラーの作成
- ルートにmiddleware('auth')設定
という手順になります。
では、今のフォーラムサイトを例に解説していきます。
まず、app\Http\Controllersフォルダに行き、
このページを表示するためのコントローラーを開きます。
そして、ページの表示を担当してるfunction に
コピーしました
コピー
$currenturl = \Request::getRequestUri();
という一行を加えます。
これは現在のURLを取得して、$currenturlという変数に代入するという事です。
そして、$currenturlをblade.phpに渡すために、同じfunctionの{ }内のreturn view()の後ろに
コピーしました
コピー
->with('currenturl',$currenturl)
というコードを追記してください。(最後に ; を忘れないでくださいね。)
これで、まず例えば、abc.com/post123というページにアクセスがあったなら、
そのページのURLが$currenturlに代入(仮保存)されます。これをのちのリダイレクトバックに使います。
次にresources\viewsフォルダに行き、
同ページ(隠したいブツがあるページ)用のblade.phpを開きます。
隠したい部分のHTMLを、@auth と@endauthでサンドイッチします。
私の場合は、回答用フォームがあるdivを丸ごとサンドイッチしました。
これで、ログインしてない時は、フォームが表示されないようになりました。
今度は逆にログインしてないユーザーにだけ、「回答する(Answer this question)」ボタンを表示します。
今度は、ログインユーザーには表示したくないので、
このAnswer this questionボタンには、@guest @endguest でサンドイッチします。
で、実はこのボタン、フォームになってます。「Answer this questionボタン」はフォームのsubmitボタンになっていて、ボタンを押すと、現在のページのURL($currenturl)がフォーム送信されるようになってます。
コピーしました
コピー
@guest
<form action="/commentlogin" method="post">
@csrf
<input type="hidden" name="currenturl" value="$currenturl">
<input type="submit" value="投稿する">
</form>
@endguest
form で /commentloginというアドレスに現在のURLを送信します。
この後、リダイレクト専用のコントローラーを作ります。
リダイレクト専用コントローラーの作成とミドルウェアの設定
では、新しいコントローラーを作るので、ターミナル(コマンドプロンプト)を開いて、
cdでLaravelプロジェクトフォルダに移動後、
php artisan make:controller RedirectbackController
と入力、Enterしてください。
そして、作成されたRedirectbackController.phpを開き、以下を追記します。
コピーしました
コピー
public function direct ($currenturl){
return redirect($currenturl);
}
これで、ブレードから送信された$currenturl(現在のURL)を受け取り、ログインが完了したら、そのアドレスにリダイレクトバックするわけです。
次に、ルート設定をします。
routesフォルダのweb.phpを開いてください。
上の一文を追記してください。
コピーしました
コピー
Route::post('/commentlogin', 'RedirectbackController@direct')->middleware('auth');
説明すると、まず、↓このボタンが押されると、
ブレードから/commentloginに現在のURLが送信されます。それをweb.phpからリダイレクト用のコントローラーに渡すわけですが、そこでmiddleware('auth')をかけてますから、ログイン画面が自動的に表示されます。
ログインが完了すると、リダイレクト用コントローラーに移り、元のURLにリダイレクトされて、コメント入力フォームが表示されてるというわけです。
これで完成です。
無事動きましたか?