PHPで基本的なことができるようになった人が、Laravelを使ってフォームを実装しようとした場合、きっと手が止まってしまいます。
LaravelなどのフレームワークはPHPを元に作られてはいますが、体感はほぼ別物です。
そのため、PHPだったらすぐに書けるようなものでもLaravelで書こうとするとわからなくなってしまうのです。
まさに私がそうでした(笑
今回は、Laravelを使ったフォームの扱い方、どのような動作をするかなどを私なりに噛み砕いてお話していきます。
フォームの仕組み
まず簡単にフォームの動作についてお話していきます。
例えばindex.phpというファイルがあり、そこにフォームを記述したとします。
そして、そのデータをsend.phpというファイルにPOSTして処理します。
PHPで記述すると、それぞれのファイルはこのようになります。
<form action="send.php" method="post">
<input type="text" name="name">
<input type="submit" value="送信">
</form>
<?php
echo $_POST["name"];
テキストボックスに入力した文字をPOSTして、send.phpが受け取った文字を出力するという非常にシンプルな動きをします。
Laravelにおけるフォームの動作
では、次にLaravelでフォームはどのように動作するのかお話していきます。
Laravelの場合は、普通にPHPで書くのと違い、コントローラやルーティングによりやり取りの制御を行っております。
普通にPHPで書くと、
index.php → send.php
で済んでいたところLaravelで書くと、
index.php → ルーティング → コントローラ → send.php
という流れになります。
厳密に言えば少し違いますが、イメージしやすいようこのような書き方にしてます。
では、このルーティングとコントローラでは具体的に何をしているのでしょうか。
それぞれについて説明していきます。
ルーティング
ルーティングは、URLを見てどの処理をするか判断します。
例えば、
https://test.com/create
https://test.com/show
このような2つのURLがあったとします。
「https://test.com」がドメインなので、ルーティングはそれより後ろを見て、
/createの場合はこの処理、/showの場合はこの処理というように判断して処理します。
コントローラ
コントローラは実際の処理を行う中心部的なものです。
具体的には、ビューの表示、モデルの処理などです。
ルーティングの処理の判断とは、実は「どのコントローラのどの処理(メソッド)を呼び出すか」を指定しています。
https://test.com/create
https://test.com/show
この2つのURLの場合、/createの場合はTestsControllerのcreateというメソッド、/showの場合はTestsControllerのshowというメソッドを実行するとルーティングが判断します。
ちなみに、このルーティングはこのように記述します。
Route::get('/create','TestsController@create');
Route::get('/show','TestsController@show');
LaravelでPOSTする際の流れ
index.php → ルーティング → コントローラ → send.php
この流れを先程お話したルーティングとコントローラの動きに当てはめてみましょう。
ルーティングはindex.php内のフォームで指定したPOST先コントローラとメソッドを指定します。
コントローラはフォームから送られてきた内容を処理してsend.phpへと返します。
流れとしてはこのようになります。
今回index.php内のフォームから送信したデータをsend.phpで受け取って出力するという動作でした。
つまり、
index.phpは送信、send.phpは受信+処理+出力
といった動作になります。
Laravelで記述すると、これが少し変わります。
index.phpで送信、コントローラで受信+処理、send.phpで出力
このように役割を分けることができます。
(実際はindex.phpを表示する際にもルーティング&コントローラの処理が入りますが)
Laravelにおけるコードの書き方
では、今までの流れを実際にコードにしてみましょう。
フォームを記述するindex.phpはほぼ変わりなしです。
<form action="/send" method="post">
<input type="text" name="name">
<input type="submit" value="送信">
</form>
フォームのActionで送信先を指定しますが、PHPでそのまま書いたときは処理&出力のsend.phpを指定しました。これを/sendというようにURLの指定へと変更します。
ここの記述方法は様々な方法がありますが、今回は一番シンプルでわかりやすいものにしました。
ルーティングはこのようになります。
また、今回コントローラ名はTestsControllerとします。
Route::get('/index','TestsController@index');
Route::post('/send','TestsController@send');
Route::get('/result','TestsController@result');
1行目はhttps://test.com/indexにアクセスした場合、index.phpを表示するというルーティングです。トップページ(フォームを表示するためのページ)表示のためですね。
2行目はPOST先を指定してます。POST先はhttps://test.com/sendというURLで、処理はsendというメソッドが行います。
3行目は結果を表示させるためのページです。https://test.com/resultというURLのページでPOSTされた結果を出力します。
では、次に肝心のコントローラの説明です。
public function index(){
return view('index');
}
public function send(Request $request){
$output = $request->name;
return view('result',compact('output'));
}
1つ目のメソッドは単純です。indexというメソッドが呼ばれたら、index.phpを表示します。(実際にはindex.blade.phpですが、説明のためあえてindex.phpと書いてます)
2つ目のメソッドはindex.phpのフォームから送られてきたデータの処理です。POSTされてきたデータは、$requestという変数にすべて格納されています。
フォームの要素であるテキストボックスにはname=”name”と記載があるようにnameという名前がついているので、$request->nameで引っ張ってくることができます。
もしフォームが<input type=”text” name=”testform”>でしたら、このデータを使うためには$request->testformと書きます。
そのため、このメソッドでは、フォームのテキストボックスに書かれたデータを$outputという変数に代入し、それをresult.phpへと渡すという処理を行ってます。
result.phpの中身については割愛しますが、このsendメソッドで渡した$outputという変数がそのまま使用できます。
LaravelでFormからPOSTしてデータを送信する方法まとめ
今回はLaravelにおけるデータの流れや、フォームの実装方法についてお話してきました。
フォームでPOSTするだけでもLaravelなどのフレームワークを使って実装すると書き方や動作の流れがかなり違ってくるので、いざ書いてみようとすると戸惑ってしまいます。
チュートリアルを何度も見返してようやく実装できるようになりましたので、今回こうやってまとめてみましたが、今からLaravelを始めるという方にとって少しでもお役に立てましたら幸いです。