こんにちは!エンジニアのオータケです!
今回は、Laravelを使ってフォームの値の受け渡しについて解説をしようと思います。
皆さんは他のフレームワークを使ったり、もしくはフレームワークを使わないそのままのPHPでフォームを作ったことがありますか?
フォームを作って値をサーバーに渡して、その値を元にデータベースにデータを保存するなど、いくつかやらないといけないことがありますがLaravelではとても簡単に実現することができます。
本記事では
[基礎] POST形式でデータを受け取るためのルーティング処理の書き方
[実践] よくありがちな間違い
について解説していきます。
ぜひご覧ください!
Laravelを使ってFormに入力したデータをPOST形式で送ろう
フォームを作る
まず、フォームを使ってデータを送るにはフォームを作る必要があります。
今回は次のようにビューに記載します。
<form action="{{ url('/message/add')}}" method="POST" class="form-horizontal"> {{ csrf_field() }} <textarea rows="6" name="message"></textarea> <button type="submit" name="add"> 追加 </button> </form>
普通のHTMLタグとBladeテンプレートエンジンが入り組んでいますが、これから解説していきます。
まずBladeテンプレートエンジンとは、LaravelでViewを書く際に用いられる機能です。
Bladeテンプレートエンジンの書き方を知ることでとてもシンプルにPHPコードを書かなくてもちょっとした処理を短く書くことができます。
最初にformタグのactionでurlという機能を呼び出していますが、これはソースコードの下の方にある「追加」ボタンを押したあとに遷移する飛び先になります。
次の行で{{ csrf_field() }}としていますが、これはCSRF対策で必要な一文になります。
CSRF?と思った方もいるかと思いますがセキュリティ上問題が起きないようにするための対策になります。
深くはここで解説をしませんが興味がある方は調べてみると良いでしょう。
あとはtextareaタグやbuttonタグを使っているだけなのでHTMLの知識があればわかっていただける内容かと思います。
ルーティングの設定を行う
フォームができたら、次にルーティングの設定をしなければなりません。
前項のサンプルコードで{{ url(‘/message/add’)}}と書いている部分がありましたが、この宛先にデータを送るためこの宛先を作る必要があります。
/プロジェクトのディレクトリ/routes/web.php
use Illuminate\Http\Request; Route::post('/message/add', function(Request $request){ });
このように書きましょう。
これで、データを受け取って処理する場所(ルート)を作ることができました。
このあとは・・・
このあとは、データベースに保存する場合は$requestの中に入っている値を使うことでフォームで入力した内容を保存することが可能です。
例えば、先程textareaタグで入力した文字列を取得したい場合は
$request->message
とすることで取得することができます。
このアロー演算子(->)のあとにあるメンバ変数の名前はHTMLのタグのname属性で付けた名前になります。
コントローラで受け取った際のRequestの中身を知りたい
では、先程の章で$request変数の中身をすべて視覚的に見たい場合どうすればよいでしょうか?
Debugbarを使うことで、簡単に情報を見ることができます。
Debugbarについては次の記事で解説していますのでご覧ください。
ブラウザから送られてきたデータだけでなく、デバッグの際によくある変数の表示などをみやすく表示する機能もありとても便利です。
一度使ってみてくださいね。
Postでデータを送る際にエラーが出て送れない?
最後に、フォームからPOST形式でデータを送ったのにサーバー側でエラーがでて受け取りができない場合といったことがあります。
この原因についてですが、よくあるパターンとしてはルーティングファイル内に記載したルートがpostでない場合に起こりえます。
具体的にソースコードで表すと、
use Illuminate\Http\Request; Route::post('/message/add', function(Request $request){ });
出ないといけない部分が、
use Illuminate\Http\Request; Route::get('/message/add', function(Request $request){ });
とgetになっていたりすると正しくデータを受け取ることができません。
もし、正しく動かない方はこのあたりも注意して見直してみましょう!
まとめ
いかがでしょうか?
LaraveでフォームデータをPOST形式で送る方法について解説をしました。
少し、うっかりしやすい面もありますが慣れれば問題なく扱えるのではないかと思います。
今回はフォームを作る際にHTMLタグをベタ打ちしましたが、こういったものを省略するヘルパなども別途公開されているようです。
興味があるかたは調べてみてくださいね。