Laravel – フォーム入力・データ登録

create, store~データの入力と登録

リソースルーティングでは、以下を意図している。

create
登録するデータを作成する。フォーム入力の場合、フォームを持つビューを表示する。
store
データをデータベースに登録する。createがフォーム入力の場合、フォームのaction先をこのルートにする。

前提

モデルデータの操作で準備した枠組みを使う。ユーザー認証機能を持ち、ユーザーごとに入力されたシンプルな投稿記事Postを扱う。

流れ

  1. ドメイン名/posts/createをGETリクエスト
  2. posts.createルートでPostsControllercreateアクションを実行
  3. createアクションで入力フォームを含むビューを表示
  4. 入力フォームのactionからposts.storeへルーティング
  5. posts.storeルートでPostControllerstoreアクションを実行
  6. storeアクションでデータベースにデータを登録

createアクションの呼び出し

リソースルーティングで以下のように設定されていて、ドメイン/posts/createからPostControllercreateアクションにルーティングされる。ルーティング名はposts.create

コントローラー~createアクション

コントローラーでは、ビューの$titleを設定してresources/views/posts/create.blade.phpを表示させるだけ。

入力フォームビュー

bladeテンプレート

投稿を入力するフォームはposts/create.blade.phpに以下の要領で記述。

actionで指定しているroute('posts.store')はデータベースへの登録アクションstoreへのルーティング。

フォームリクエスト~バリデーション

フォーム入力のバリデーションをフォームリクエストに記述する。

まず、以下のコマンドでフォームリクエストを作成。

app/Http/Requestsディレクトリーに作成されたPostRequest.phpを編集し、バリデーションルールを追加。ここでは唯一のフォーム入力commentに対して、入力必須(required)と最大200文字(max:200)を配列で設定している。

コントローラー~storeアクション

use指定

PostControllerPostモデルとPostのフォームリクエストを使うため、以下のようにファイル冒頭でuse指定する(個別の名前空間指定が不要になる)。

storeアクション

入力フォームのaction先で指定されたアクションメソッドで、フォームの入力をデータベースに書き込む。

ここではPostクラスが継承しているModelクラスのcreate()メソッドで、フォームリクエストのパラメーターをセットしてデータを書き込んでいる。

  • 入力バリデーションはマスアサインメント実行時にフォームリクエストで実行され、エラーがあれば$errorsに格納される
  • Post::create()は最終的にEloquent/Buildercreate()が実行されるらしい(参照:モデルのcreate()メソッドはどこに?)

データ書き込み後posts.indexにリダイレクトしているが、これは投稿記事一覧表示へのルーティング。

モデルでの$fillable設定

create()メソッドによる登録はマスアサインメントになるので、モデルに$fillableを定義しておく。

確認

ユーザーログイン状態でドメイン名/posts/createをGETリクエストすると入力フォームのページが表示され、投稿ボタンを押すとデータが登録される。

たとえばuser1とuser2をユーザー登録しておいて・・・

それぞれの記事を投稿した結果は以下の通り。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です