LaravelでPOST形式でデータを受け渡しができない時はURLの形式を確認しよう!


最近LaravelでPHP書いています。
LaravelっていうのはWEBアプリケーションを作りやすいPHPのフレームワーク
これまでPHPでゴリゴリコードを書いてたんですが、最近はみんなLaravelよく使ってるみたいなので僕も使い出しました。
PHPの仕事の案件でも最近はLaravelで開発っていう募集案件が多かったりします。
若い方でこれからPHPやろうって思ってる人は勉強はしておいて損はないと思う。
弊社は基本的にシステムは社内ではやらないんですが、提携しているシステム会社の方も最近はLAravelでの案件が増えてるって言ってました。
Laravel使えないだけで、取れない案件が増えてくるって。

自分もPHPによるWEB開発は、もうしばらくはできてたいので、こんなにみんなが便利って言ってるんだったらやっとこうかなと。
PHPはできるので、それをさらに効率的に使えるようにしてくれるんならいいなぁということで、勉強兼ねて始めてます。

で、そんな中で次のことでハマりました。
本にも載ってないし、ググってもなかなか出てこなかったので同じようなことで悩んでる人のために書いておきます。

グダグダ書いてるけど、要するに言いたい結論はこれ!
LaravelでPOST形式でデータを渡す場合、フォームのactionのURLは最後に’/’を入れたらだめ!

POSTで送ったデータが取得できない!

今回ハマったのはフォームパラのデータを受け取る方法。
PHPではフォームのデータをこのように受け取ります。

まずはフォーム部分のコード

<form action="./spot/list/" method="post">
	<input type='text' name='name'>
	<input type='submit'>
</form>

で、これをLaravelのweb.phpでこのように受け取ります。

Route::post(‘spot/list/’, ‘HomeController@SpotList’);

ちなみに後述するけれど、データの受け渡しにはPOST形式のほかにGET形式というものがあります。
どちらでもデータを受け取れるように、こういった書き方もある。

Route::match([‘get’, ‘post’],’spot/list/’, ‘HomeController@SpotList’);

すでにここに今回ハマった原因が入ってるんだけれど、
本とかで勉強してても、これみてどこが悪いのかわからないかも。
でも、これではうまくパラメータが受け渡せない。

PHPでイチからコード書いていく場合には問題なかったんだけれど、laravel特有の問題みたい。
ということで、これまでPHPでゴリゴリ書いていた自分は完全にハマったわけです。

methodのURLは最後に’/’を入れない

さて、コードもむっちゃ短いし、入門の本の初期の初期の頃に学ぶPOSTによるデータの受け渡し。
何がまずかったかと言うと、フォームのactionの所に入っているURLに問題がありました。

今回駄目だったコードはこれ。

<form action="./spot/list/" method="post">
	<input type='text' name='name'>
	<input type='submit'>
</form>

で、正しく動くのは

<form action="./spot/list" method="post">
	<input type='text' name='name'>
	<input type='submit'>
</form>

どこが違うかわかりますか。
そう、URLの最後に/を入れたらダメなんですね。

action=”./spot/list”

こうしないといけない。
通常のPHPでは、”/”入っていても問題なく動くんですが、Laravel上で動かすと内部的にリダイレクトがかかるみたいで、リダイレクト時にはデータは受け渡されなくてそのまま最終的にデータが受け取れないってことになるんです。
Laravelではフォームのactionの最後には”/”を入れてはいけない、とかは書いている参考書はたぶんなくて、何でも知ってるGoogle先生に聞いてみてもなかなか出てこなかった。
フォームによるデータの受け渡しって、WEBサービス作るうえで必要不可欠な要素で、Laravelを勉強したら基本として入門書籍に入っている内容。
これからプログラミング勉強するぞ!っていう人がこんなところでハマったら挫折しかねない。
ということで、同じようなところではまってしまった人のちょっとでも助けになればと思います。
まあ、僕の場合はこれまでPHPだけでやってきたので、その時の習慣とか先入観もあってハマったっていうのもあるでしょうね。

GETとPOSTの話

ちなみに、POSTに対してもう一つデータを送る方法があって、それはGETという方式です。
簡単に言うと、GETの形式はURLでパラメータを指定して送る方法で、POSTというのは内部的に見えないところでデータを送る方法です。
フォームは一般的にはPOSTの形式を使います。
アンカーリンク<a>等で、生のURLでしか指定できない場合にはURLにパラメータを使ってデータを仕込みます。
Googleの検索結果時に、URLを見るとパラメータがいっぱい入ってるのがわかります。
img
今回、GETの方式では特に問題はなくちゃんと動いたんですか、POSTの形式の場合だけうまく動いてませんでした。
リダイレクト時は一般的にGET形式でデータを受け渡すので、一応説明はつきそうです。

自分がLaravelを勉強したのはこれ。

入門としていいですよ。

[RelService] [Service]