2023.3.23前回記事「Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#6:ミドルウェアの設定と認証ページ作成」では、ログインユーザーのマイページとして認証ページの作成を行いましたが、今回はその続きでマイページからユーザー情報の編集ができるデータベースの更新処理や、ユーザーのIDに合わせてルーティングを動的に制御する方法を見ていきます。この記事では、ログイン用のテストユーザーが作成されており、基本的なアプリケーションの環境構築が出来上がっている前提で進めていきます。これまでの内容については過去記事等をご参考ください。現状ではユーザーのマイページが固定ルーティングのため、ログインユーザーことにマイページを共有する必要があります。そこでURLにユーザー固有のIDを含む動的なルーティングになるよう変更していきます。下記のようにルーティングへidという名前のパラメータを渡す形に変更していきます。することで、Controller側で変数として扱えるようになります。'AdminController@index')->name('admin');});これで、マイページのURLは「http://localhost:8000/admin/ユーザーID」という形で扱えるようになります。動的ルーティングの設定が終わるとControllerの方でパラメーターを変数として受けとり、その変数をもとにログインユーザーの情報を取得し、View側へ情報として受け渡していきます。受け取るパラメーター名がそのまま変数名になりますので、その値であるユーザーのIDを「findOrFail()」メソッドでデータベースから検索します。「find()」メソッドもありますが、findOrFail()メソッドの場合、見つからなければそのまま404エラーが返ってくるのでこちらを採用します。}}上記の通り、動的ルーティングによりURLが変わるので、routeメソッドでリンクを設定している場合には、第二引数でパラメーターの値を入れるように変更していきます。}}">ユーザーマイページ</a>この際にView側でユーザー情報を持っていない場合にはエラーとなるので、Controller側からユーザー情報を受け渡しておきます。}}これでユーザーIDに合わせて個別のマイページのルーティングが完成しました。URLにユーザーIDを含むようになり、ユーザーごとに専用のURLが用意されるようになります。次はユーザー情報の編集ページを作成していきます。ViewファイルとなるBladeのテンプレートを作成していきます。ユーザーマイページのトップである「index.blade.php」に対して「edit.blade.php」というファイルを作成していきます。resources/views/admin/edit.blade.phpディレクトリ構成は下記のようになります。ここからこれまで同様にControllerとルーティングの設定、ページテンプレートを作り込んでいきます。ユーザー情報編集ページ表示の処理をControllerへ追記Viewファイルができたら、それを表示させるための処理をControllerに追加していきます。ユーザーマイページ同様にURLのパラメーターであるIDを使って、データベースからユーザーデータを取得し、View側へ受け渡しておきます。次にユーザー情報編集ページのルーティングを設定していきます。こちらもユーザーマイページ同様にユーザーIDがURLに含まれる動的ルーティングとして処理できるようにしていきます。'AdminController@edit')->name('admin-edit');});この際に、合わせてユーザーマイページのテンプレート内にユーザー情報編集ページへのリンクを追加しておき、ユーザー情報編集ページへの動線を用意しておきます。ユーザー情報編集ページのページテンプレートとデータベース更新フォームの作成ユーザー情報の編集ですが、フォームに入力した値をデータベースに更新していく形になるので、そのために必要なフォームを作成していきます。この際に重要なのは、formからはHTTPのPUTメソッドを使うことで、データベースに登録されている値を上書き更新していくのですが、form要素の属性には「POST」と指定し、Laravelのディレクティブで「@method('PUT')」とする形にしておきます。合わせて「@csrf」も追加しておき、CSRF対策も行います。</main>@endsection.......それ以外は、各フォーム要素のname属性の値がユーザー情報を受け取る際のキーになるので、合わせて設定しておき、フォームの初期値にはデータベースに登録されているユーザー情報が入るようにしておきます。ユーザー情報編集処理の追加とルーティングの設定フォームは出来上がりましたが、まだデータベースへの更新ができない状況ですので、Controllerでデータベースの更新処理を追加していきます。データベース更新用の処理を追加し、その中でユーザー情報編集ページからフォームに入力された値を受け取り、「save()」メソッドを使うことで、データベースに保存するようにしていきます。保存ができたら、そのままユーザーマイページにリダイレクトされるようにします。}}Controller側で作成した上記処理を呼び出すためにルーティングを追加します。ここではユーザー情報編集ページに対して、PUTメソッドを使っているので、Route::get()メソッドではなく、「Route::put()」メソッドで設定していきます。'AdminController@update')->name('admin-update');});これでひとまずはデータベースに登録されているユーザー情報を更新できるようになります。バリデーション処理がないので、値が空でも登録できたり、入力値のフォーマットが誤った状態で更新される可能性もあります。そのためバリデーション処理を追加する必要があります。バリデーション処理の追加フォームの入力値に対してバリデーションを適用できるようにしていきます。Controller側にあるデータベースの更新処理に、「Validator::make()」メソッドでバリデーションを行っていきます。このメソッドで第二引数にバリデーションルール、第三引数にバリデーションメッセージをそれぞれ連想配列の形で指定していきます。今回は必須入力とメールアドレスの形式チェックを適用していきます。}}バリデーションルールにマッチしない場合には、エラーメッセージを受け渡してそのままユーザー編集ページを再表示されるようにします。このエラーメッセージはフォームがあるユーザー情報編集ページで表示させることができます。フォーム側でバリデーションのエラーメッセージを表示させるように「@error」ディレクティブを使ってメッセージ部分の要素を追加していきます。</main>@endsection.......実際にバリデーションルールにマッチしない場合には、ログイン画面同様にエラーメッセージが表示され、データベースへの更新処理は行われないままになることが確認できます。今回はユーザーマイページからユーザー情報を更新するケースを例に、データベース更新処理を作成していきました。このようにデータベースから特定の値を取得して、その値を更新するというのはウェブアプリケーションでも基本的な機能になります。動的ルーティングについても、ブログサイトなどページを動的に増やしていく際には必須となるので合わせて覚えておきたいですね。topこのウェブサイトはCookieを使用します当ウェブサイトではCookieを使用してアクセス解析や広告を行なっており、ウェブサイトの運用やコンテンツ制作に役立てています。サイトの利用を続けることで、Cookie使用に同意したことになります。