2017/08/13
FORMの入力内容をDBに書き込む
Laravel5.4 MySQLと接続その3 の続きです。laravelをインストールしてDBからデータを取得できるようになりましたので入力フォームからデータを取得してDB に書き込もうと思います。
まずはフォームを作成します。
インストールファルダのresources\viewsの中に任意の名前のファイル(form.blade.php)を作成します。
form.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="">
<title>入力フォーム</title>
</head>
<body>
<form action="" method="post">
{{ csrf_field() }}
<p>タイトル<input type="text" name="title"</p>
<p>要約<input type="text" name="descript"</p>
<p>カテゴリ<input type="text" name="category"</p>
<p>内容<input type="text" name="comment"</p>
<p><input type="submit" value="登録"></p>
</form>
</body>
</html>
form要素の下の行の {{ csrf_field() }}はLaravel 5.4 CSRF保護によればクロス・サイト・リクエスト・フォージェリ攻撃を防止する目的のもので必須のものと思われます。自らランダムトークンをセッションに保存しなくてもいいよってことですね。 {{ csrf_field() }}がないとエラーで動作しません。
作成したフォームを表示するようにweb.phpに追記します。routes/web.phpに
Route::get('form',function(){
return view('/form');
});
を追記します。public/formでアクセスされた時にform.blade.phpを表示させます。次に送信ボタンを押したときの動作ですが通常form要素のaction属性に遷移しますが、今回action属性は空白です。web.phpにformからpostでデータを送信された時の遷移先を記入します。
Route::post('/form','ArticleController@store');
formページにpostでアクセスされた時はArticleControllerのstoreメソッドを実行してねという意味ですね。
現段階までに、app\Http\controllersの中にArticleController.phpを作っていますのでそれにstoreメソッドを追記します。
ArticleController.php
public function store(Request $request){
$article= new Article();
$article->title = $request->title;
$article->descript = $request->descript;
$article->category = $request->category;
$article->comment = $request->comment;
$article->save();
}
まずはメソッド名であるstoreは任意のものでも構いませんが、 リソースコントローラで
リソースコントローラーにより処理されるアクション
動詞 | URI | アクション | ルート名 |
---|---|---|---|
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
となっているようですのでstoreに倣っておきます。Request $requestはPOSTで送られてきたデータが入っています。php artisanのmakeでコントローラーを作成すると自動でuse Illuminate\Http\Request;が記述されているはずですので唐突に見えますが、Request型の変数$requestからformのデータが取得できます。$_POSTみたいなものでしょうか。
$article= new Article();でArticleクラスのオブジェクトを新しく作成します。use App\Article;をコントローラーに記述しておきます。これはデータベース接続のモデルの事ですね。このオブジェクトはDBのarticleテーブルのカラム名と同じプロパティを持っているのでそのプロパティにフォームから入力された値を代入してあげます。ほぼ毎回フォームのnameとテーブルのカラムは一致すると思いますので$article->title = $request->title;のような書き方になると思います。
最後に代入を終えたオブジェクトにsaveメソッドを実行することでDBにデータを書き込むことが可能です。