Laravelでログイン後、元いた同じページにリダイレクトバックする方法

更新日:

今回は、Laravelサイトでログイン画面を表示させた後、元いたページにリダイレクトバックする方法を解説します。

 

例えば、こんなシチュエーション。

知恵袋サイトを作ってるとして、閲覧者が回答フォームに入力するには、
ログイン必須にしたいとします。

 

なので↑こんな感じの入力フォームが表示されるのはログイン後だけにして、
ログインしてない時は↓

こんな感じにボタンだけ表示し、ボタンをクリックすると、ログイン画面に飛び、ログインが完了すると、このページに戻ってきて、入力フォームが表示されるようにしたいとします。

この特定ページ→ログイン画面→元いたページとリダイレクトバックをLaravelサイトで実装する方法を解説します。

 

Laravelでログイン後、元いた同じページにリダイレクトバックする方法

まず、全体の手順としては、

  1. 現在URLの取得コードをコントローラーに追記
  2. ブレードに現在URL送信フォームを設置
  3. リダイレクト専用コントローラーの作成
  4. ルートに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にリダイレクトされて、コメント入力フォームが表示されてるというわけです。

これで完成です。
無事動きましたか?

 

写真で血圧記録

  • この記事を書いた人

Neby

本を毎日多読しつつ、資産運用、プログラミング、心理学、ネットビジネススキルを猛向上中。貧富の差が広がる5年後、10年後に安心生活を送るためのお金のリテラシー、スキル、資産を一緒に作っていきましょう。

-PHP Laravel入門