こんにちは。テダスクのとしです。
この記事を見ていただいている人は、恐らくlaravelでPOSTでデータの送信は出来るけど、
GETでどうやって送信して、その後どうやって取得するのだろうと悩んでいる方だと思うのですが、そのやり方について今回はお伝えしようと思います。
laravelでGETでデータ送信する状況とは
そもそもlaravelであれ、htmlであれGETでデータを送信する状況ってどういう状況でしょうか?
一般的には、サイト内検索とかでしょうか。
FORMからGETで送信すると例えばURLが
https://tedask.jp/article?search=laravel
のようにarticleというページに対して?search=laravelという文字が付いていますが、laravelという文字をクエリ文字列という形で遷移先のPHPファイルにデータ送信するわけですね。
POSTの場合は、このクエリ文字列を表示していないだけで、やっていることは同じです。
ただ、今回この記事を書こうと思ったのは、サイト内検索でGETをする方法をメモるために作ったのではなく、別な理由でこの記事を書こうと思いました。
どういった状況でこのGETを使うかというと、送信したデータがあって(例えば、商品のIDとか)それを、お気に入りとしてDBに登録したいんだけれども、一旦ログインを挟む場合、ログイン認証の時にPOSTするので、最初に送信しようとしていた商品IDを更にPOSTしようとすると、途中でデータが落ちてしまってエラーが起こり結局元の商品に戻ることも、お気に入りに登録することも出来ない。
そんな状態を回避するためにGETを使います。
記述はmethod=”POST”を”GET”に変えるだけ
記述の方法は、method=”POST”をmethod=”GET”に変えるだけで他はそのままでControllerでRequestとしてデータの取得が出来ます。
例)
view/item.blade.php
<form method="GET" action="{{action('ItemController@bookmark')}}"> {{ csrf_field() }} <input type="hidden" value="{{$item->id}}" name="item_id"> <input type="submit" class="btn btn-primary" value="お気に入りに追加する"> </form>
route/web.php
Route::get('/nologinbookmark', 'ItemController@bookmark');
itemController.php
public function nologibookmark(Request $request) { $user = Auth::user(); $bookmark = Bookmark::where('user_id', $user->id) ->where('item_id',$request->item_id) ->first(); //既にお気に入りに登録されているかを判定 if(empty($bookmark)) { $bookmark = new RecommendOshimen(); $bookmark->user_id = $user->id; $bookmark->item_id = $request->item_id; $bookmark->save(); return redirect('/item/'.$request->item_id)->with('flash_message', 'ブックマークしました。'); } else { return redirect('/item/'.$request->item_id)->withErrors(['message' => 'すでにブックマークしています。']); } }
こんな感じでしょうか。
見て分かるとおり、GET以外の処理はPOSTの時と変わりませんね。
他のコントローラーについては、参考程度にして下さい。
この他にも、例えばformのactionのURLにIDを含めて送信するという手もありますよ。
view/item.blade.php
<form method="GET" action="{{action('ItemController@bookmark', $item->id)}}"> {{ csrf_field() }} <input type="submit" class="btn btn-primary" value="お気に入りに追加する"> </form>
route/web.php
Route::get('/nologinbookmark/{id}', 'ItemController@bookmark');
最後に
以上で、laravelでformからGETで送信する方法の説明を終わります。
routeの指定ファイルで送信のときはPOSTとかPATCHとか指定するのが普通だと思うので、一瞬GETでどうやるんだろうって悩んでしまうのですが、単純にformでGETさえ指定すればあたりまですが、GETとして送信されるのでrouteもGETのままでOKということですね。
参考になれば幸いです。
WordPressやWEB技術、集客、ChatGPTなど最新技術に関する情報を毎週お届けする
メールマガジンを発行しています。
不定期でWordPressの脆弱性情報も配信していますので、
WEB担当者やWEBを学んでいる方などにオススメの無料メールマガジンです!
コメント