Laravel – データ編集・更新

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

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

edit
データを編集する。フォームで編集する場合、フォームを持つビューを表示する。
update
編集後の内容でデータベースのデータを更新する。editがフォームでの編集の場合、フォームのaction先をこのルートにする。

前提

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

流れ

  1. 編集する記事の$idを指定してドメイン名/posts/(id)/editをGETリクエスト
  2. posts.editルートでPostsControllereditアクションを実行
  3. editアクションで編集フォームを含むビューを表示
  4. 編集フォームのactionからposts.updateへルーティング
    methodPATCH
  5. posts.updateルートでPostControllerupdateアクションを実行
  6. updateアクションでデータベース上のデータを更新

editアクションの呼び出し

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

編集対象の記事を指定してposts.editにGETリクエストでルーティングする例として、以下のようなアンカー要素がある。

route()メソッドの第2引数でモデルデータを指定すると、自動的にルーティングに沿った形でデータのidがURLに埋め込まれる。

上記の例ではルーティングがposts.editでURLがposts/{post}/editとなっているので、例えば記事idが3の記事の場合は以下のようなURLとなり、これがブラウザーにも表示される。

ドメイン名/posts/3/edit

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

コントローラーでは、ビューの$titleと編集対象の記事のインスタンスを設定してresources/views/posts/edit.blade.phpを表示させる。

editアクションに来る際にURLに埋め込まれたidが、editアクションメソッドの引数$idとして受け取られる。この$idPostモデルのfind()メソッドの引数に与えて、指定したidの記事データを取得する。

編集フォームビュー

bladeテンプレート

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

ここでHTTPのメソッドはPOSTだが、ルーティングではPATCHメソッドを期待しているので、@method('patch')ディレクティブが必要。

actionで指定しているroute('posts.update', $post)はデータベースの更新アクションupdateへのルーティング。

PATCHに対するルーティングのURLはドメイン名/posts/(id)となる。

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

編集フォームのバリデーションは入力フォームのところで作成したフォームリクエストを使う。

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

use指定

PostモデルとPostRequestに対するuse指定はフォーム入力で指定済み

updateアクション

入力フォームのaction先で指定されたアクションメソッドで、編集後の内容でデータベースを更新する。

ここでの要点は以下の通り。

  • フォームリクエストのバリデーションを有効にするため、update()メソッドのインジェクションをPostRequestにしている
  • update()メソッドの第2引数で、URLに埋め込まれたid$idとして受け取られている
  • Postクラスのfind()メソッドの引数に$idを渡して、指定したidの記事インスタンスを$postで参照している
  • 編集対象記事のインスタンス$postupdate()メソッドの引数に、更新対象の要素を渡している
    • 更新対象の要素は、引数のリクエストで得られたフォーム入力のcommentonly()で限定している
  • 更新後のデータを含めた一覧表示のため、indexにリダイレクトしている

モデルでの$fillable設定

update()メソッドでのフォームリクエストによる登録はマスアサインメントになるので、モデルに$fillableの定義が必要(フォーム入力のところで定義済み)。

確認

ユーザーログイン状態で<a href="{{ route('posts.edit', $post) }}">編集</a>などでGETリクエストすると編集フォームのページが表示され、更新ボタンを押すとデータが更新される。

 

コメントを残す

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