実現したいこと
index(ホームページ名:選手一覧画面)として全選手のデータをid順に表示させているのですが、そのページから選手を一人一人編集させるために ” POSTメソッド ” を用いて「選手編集画面」に遷移させられるようにしたいです。
発生している問題・分からないこと
index(選手一覧画面)から「選手編集画面」に遷移しようとした際にエラーメッセージ「Class "App\Http\Controllers\PlayerUpdateRequest" does not exist」が表示されている状況です。
エラーに対してどう改善を行ったか:
・PlayerUpdateRequestという名前でフォームリクエストクラスを作成し正確にフォームリクエストできるよう設定
・フォームリクエストクラス内のruleメソッドにフォームリクエストのルールを追加
追加内容:
public function rules(): array
{
return [
//
'position' => 'required|string|max:255',
'name' => 'required|string|max:255',
'country_name' => 'required|string|max:255',
'club' => 'nullable|string|max:255',
'birth' => 'nullable|date',
'height' => 'nullable|numeric',
'weight' => 'nullable|numeric',
];
}
・データを更新していなかったため、コマンドプロンプトを用いて「composer dump-autoload」を実行
該当のソースコード
route(web.php)
1//選手一覧画面の遷移を取得 2Route::get('/', [Controllers::class, 'index'])->name('players.index'); 3 4//選手編集画面の遷移ルートを設定 5Route::get('/players/{id}/update', [PlayerController_update::class, 'update'])->name('players.update'); 6Route::POST('/players/{id}/update', [PlayerController_update::class, 'update'])->name('players.update');
indexのController(Controllers.php)
1<?php 2 3//選手一覧画面の遷移処理 4 5namespace App\Http\Controllers; //空間を定義 6 7use Illuminate\Support\Facades\Log; 8 9use Illuminate\Http\Request; //Httpリクエスト 10 11use Illuminate\Foundation\Auth\Access\AuthorizesRequests; 12 13use Illuminate\Foundation\Validation\ValidatesRequests; 14 15use Illuminate\Routing\Controller as BaseController; 16 17use Illuminate\Support\Facades\DB; // DBファサードを追加 18 19use App\Http\Controllers\PlayersController; 20 21use App\Http\Controllers\PlayerController_detail; 22 23use App\Models\Player; 24 25/*Playersテーブルに「del_flg」カラムを追加 */ 26 27use Illuminate\Database\Migrations\Migration; 28use Illuminate\Database\Schema\Blueprint; 29use Illuminate\Support\Facades\Schema; 30 31use Illuminate\Database\Eloquent\SoftDeletes; 32 33class Controllers extends BaseController 34{ 35 //コントローラークラスを作成する際に、認可とバリデーションの機能の付与 36 use AuthorizesRequests, ValidatesRequests; 37 use SoftDeletes; 38 39 //indexメソッドの定義 40 public function index(Request $request, $id = null) // $request を引数として受け取る 41 { 42 // Player モデルを使用して選手データを取得し、ページネーションを実行 43 // playersテーブルのカラムが「del_flg="0"」の選手のみを表示させるように設定 44 // playersテーブルとcountriesテーブルを結合し、所属国を含む選手データを取得 45 46 $request->route('id'); 47 48 // 削除したレコードを復元 49 $this->restoreDeletedRecords($id); 50 51 // Playerモデルのindex()メソッドを呼び出して選手データを取得 52 $players = Player::index(); 53 54 //'del_flg'が0の選手を表示、withTrashed()=再アクセス時に論理削除(Softdelete)したものを取得 55 56 $players = Player::where('del_flg', 0)->withTrashed() 57 ->join('countries', 'players.country_id', '=', 'countries.id') 58 ->select('players.id', 'countries.name as country_name', 'players.uniform_num', 'players.position', 'players.name', 'players.club', 'players.birth', 'players.height', 'players.weight') 59 ->whereNull('players.deleted_at') // 論理削除されていないレコードのみを取得する 60 ->paginate(20); 61 62 // 選手一覧画面に選手データを渡して表示 63 return view('players.Alldata', ['players' => $players]); 64 } 65}
<?php // 選手編集画面の処理(Playerモデルを使用して指定したIDに該当する選手の情報を取得) namespace App\Http\Controllers; use App\Http\Controllers\Controllers; use Illuminate\Http\Request; use App\Models\Player; class PlayerController_update extends Controllers { public function update(PlayerUpdateRequest $request,$id){ // バリデーションルールの定義 $validatedData = $request->validate([ 'uniform_num' => 'required|numeric', 'position' => 'required|string|max:255', 'name' => 'required|string|max:255', 'country_name' => 'required|string|max:255', 'club' => 'nullable|string|max:255', 'birth' => 'nullable|date', 'height' => 'nullable|numeric', 'weight' => 'nullable|numeric', ]); // Playerモデルを使用して指定したIDに該当する選手の情報を取得 $player = Player::findOrFail($id); $player = Player::join('countries', 'players.country_id', '=', 'countries.id') ->select('players.*', 'countries.name as country_name') ->where('players.id', $id) ->first(); // Eloquentモデル(findOrFail)のインスタンスを取得して、単一の選手の所属国を取得 // 選手データを更新 $player->uniform_num = $validatedData['uniform_num']; $player->position = $validatedData['position']; $player->name = $validatedData['name']; $player->country_name = $validatedData['country_name']; $player->club = $validatedData['club']; $player->birth = $validatedData['birth']; $player->height = $validatedData['height']; $player->weight = $validatedData['weight']; $player->save(); // 選手編集画面に選手データを渡して表示 return view('players.update', compact('id','validatedData','player')); } }
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use App\Http\Controllers\Controllers; class PlayerUpdateRequest extends FormRequest { /** * Determine if the user is authorized to make this request. */ public function authorized(): bool { return false; } /** * Get the validation rules that apply to the request. * * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string> */ public function rules(): array { return [ // 'position' => 'required|string|max:255', 'name' => 'required|string|max:255', 'country_name' => 'required|string|max:255', 'club' => 'nullable|string|max:255', 'birth' => 'nullable|date', 'height' => 'nullable|numeric', 'weight' => 'nullable|numeric', ]; } }
indexのview(Alldata.blade.php)
1<body> 2 <!-- 選手データの表示 --> 3 <table> 4 <tr> 5 <th>No</th> 6 <th>背番号</th> 7 <th>ポジション</th> 8 <th>所属</th> 9 <th>名前</th> 10 <th>国</th> <!--所属国を表示(Controllers.phpでplayersテーブルとcountriesテーブルを共有結合済み) --> 11 <th>誕生日</th> 12 <th>身長</th> 13 <th>体重</th> 14 <th></th> 15 <th></th> 16 <th></th> 17 </tr> 18 @foreach($players as $player) 19 <tr> 20 <th>{{ $player->id }}</th> 21 <th>{{ $player->uniform_num }}</th> 22 <th>{{ $player->position }}</th> 23 <th>{{ $player->club }}</th> 24 <th>{{ $player->name }}</th> 25 <th>{{ $player->country_name }}</th> <!-- 所属国を表示(Controllers.phpでplayersテーブルとcountriesテーブルを共有結合済み) --> 26 <th>{{ $player->birth }}</th> 27 <th>{{ $player->height }}</th> 28 <th>{{ $player->weight }}</th> 29 <th> 30 <button class="detail"><a href="{{ route('players.detail', ['id' => $player->id]) }}"><p>詳細</p></a></button> 31 </th> <!-- 詳細ボタンを追加 --><!-- GET通信でリクエストパラメータとして選手IDを送信 --> 32 <th> 33 <form action="{{ route('players.update', ['id' => $player->id]) }}" method="POST"> 34 @csrf 35 @method('POST') 36 <button type="submit" class="edit"><p>編集</p></button> 37 </form> 38 </th> <!-- 編集ボタンを追加 --><!-- GET通信でリクエストパラメータとして選手IDを送信 --> 39 <th> 40 <form id="delete-form-{{ $player->id }}" action="{{ route('players.delete', ['id' => $player->id]) }}" method="POST"> 41 @csrf 42 @method('DELETE') 43 44 <button type="submit" class="delete" onclick="return confirmDelete('{{ $player->id }}')"><p>削除</p></button> 45 </form> 46 </th> <!-- 削除ボタンを追加 --> 47 </tr> 48 @endforeach 49 </table> 50 51 <!-- ページネーションリンクの表示 --> 52 {{ $players->links('vendor.pagination.default') }} 53</body>
試したこと・調べたこと
上記の詳細・結果
ネット上で「Class "App\Http\Controllers" does not exist laravel エラー」と検索をして調べた後にルーティングや選手一覧画面のviewのメソッドを修正して、選手編集画面にエラーなく遷移できるか再度検証してみたのですが上記のエラーが解消されませんでした。
この問題につきまして分かる方や詳しい方いましたら、ぜひご教授頂ければ嬉しいです。
補足
特になし
0 コメント