普段はWordPressに関する技術情報を中心に発信していますが、過去に私がLaravel開発で直面し、解決した問題の記録として、この記事を残しています。
こんにちは。TEDASKのToshi Seitoです。
この記事を見ていただいている人は、恐らくlaravelでPOSTでデータの送信は出来るけど、
GETでどうやって送信して、その後どうやって取得するのだろうと悩んでいる方だと思うのですが、そのやり方について今回はお伝えしようと思います。
laravelでGETでデータ送信する状況とは
そもそもlaravelであれ、htmlであれGETでデータを送信する状況ってどういう状況でしょうか?
一般的には、サイト内検索とかでしょうか。
FORMからGETで送信すると例えばURLが
のように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ということですね。
参考になれば幸いです。
「独自のWEBサービス構築」でお悩みではありませんか?
- 「独自の会員制サイトやマッチングサービスを開発したいけれど、技術的な壁がある」
- 「データの設計や認証周りの挙動が複雑で、自力での開発に限界を感じている」
- 「ビジネスを支える根幹システムだからこそ、経験豊富なプロに設計から任せたい!」
Laravelのような高度なフレームワークを用いた開発は、単にコードを書くだけでなく、ユーザー体験やデータの整合性、セキュリティを考慮した緻密な設計が不可欠です。一つの仕様の選択が、将来の拡張性や保守コストを大きく左右します。
TEDASKでは、Laravelを用いた独自のWEBシステム開発から、既存システムのバグ改修、API連携、技術的なセカンドオピニオンまで幅広く対応しています。
「アイデアを形にしたいけれど、技術面が不安」「今の開発が正しいのかプロに診断してほしい」という方は、ぜひ一度お気軽にご相談ください!
