事象
処理後のリダイレクトをしたいのに、今いるURLにしか飛ばず更新処理もなにもされない。
経緯
最近Laravelでゲームマスタデータの管理をするWebアプリを開発中、データの更新処理後に一覧ページに戻ってメッセージを表示するという基本的な処理を実装していました。
※ソースは実際のものから変数名などだけ修正しています。
[web.php]
//登録画面表示
Route::get('/master', 'Create\CreateMasterController@index')->name('index');
//登録処理
Route::post('/master', 'Create\CreateMasterController@insert')->name('insert_race');
//編集画面表示
Route::get('/master/{edit_id}', 'Create\CreateMasterController@edittemplate')->name('update_race_temp');
//編集更新処理
Route::patch('/master/update/cmp', 'Create\CreateMasterController@editcomplate')->name('update_race');
[Controller]
/**
* Show the application dashboard.
*
* @return 登録画面(初期画面)
*/
public function index()
{
$list = $this->repository->selectAllList();
$iconLink = $this->repository->ICONFILE_DIR;
return view('create/master/index', compact('list', 'iconLink'));
}
/**
* 処理完了後のリダイレクトする処理
*/
private function indexview($var, $result){
return redirect()->route('index')->with(['message' => $var, 'result' => $result]);
}
/**
* 登録
* @return 登録処理
*/
public function insert(MasterFormRequest $form){
$target = $this->repository->selectEditMaster($form->id);
if($target){
return $this->indexview('既に登録されているIDです', 4);
}
$this->repository->addMaster($form);
return $this->indexview('登録が完了しました', 2);
}
/**
* 編集画面へ遷移
* @return 編集画面
*/
public function edittemplate(Request $request){
$target = $this->repository->selectEditMaster($request->edit_id);
if(!$target){
return $this->indexview('ID:'.$request->edit_id.'のデータが取得できませんでした', 4);
}
$list = $this->repository->selectAllList();
$iconLink = $this->repository->ICONFILE_DIR;
return view('create/master/edit',
compact('list', 'iconLink', 'target')
);
}
/**
* 更新処理
* @return 更新結果画面
*/
public function editcomplate(MasterEditFormRequest $form){
$target = $this->repository->selectEditMaster($form->id);
if(!$target){
return $this->indexview('ID:'.$form->id.'のデータが取得できませんでした',4);
}
$this->repository->updateMaster($form);
return $this->indexview('更新が完了しました', 2);
}
/**
* 削除
* @return 削除した情報
*/
public function delete(Request $request){
$target = $this->repository->selectEditmaster($request->delete_id);
if(!$target){
return $this->indexview('ID:'.$request->delete_id.'のデータが取得できませんでした',4);
}
$delete = $this->repository->delete($request->delete_id);
return $this->indexview('ID:'.$request->delete_id.'の削除が完了しました',2);
}
[View]
<div>
編集フォーム
<form action="{{ route('update_race') }}" method="POST">
@csrf
@method('PATCH')
<div class="col-md-3">
<label for="validationDefault01" class="form-label">データID</label>
<input type="text" readonly class="form-control" id="validationDefault01" name='id' value="{{$target->id}}" required/>
</div>
<div class="col-md-3">
<label for="validationDefault02" class="form-label">名</label>
<input type="text" class="form-control" id="validationDefault02" name='name' value="{{$target->name}}" required/>
</div>
<div class="col-md-3">
<label class="form-label">説明文</label>
<input type="textarea" name='discription' value="{{$target->discription}}" />
</div>
<div class="col-md-3">
<label class="form-label">アイコン画像ファイル</label>
<label>ファイル名 : <p>{{$target->icon}}</p></label>
<image src="{{ asset('storage/image/'.$target->race_icon) }}"></image>
<input type="file" name='icon' value="/" />
</div>
<input type="submit" value="更新" />
</form>
</div>
Form内に変なaction属性があるのか?更新ボタンがForm内にないとか?同じURLだとgetが優先されている?
(/master/{edit_id}があるので/master/cmpがURLパラメータ固定のものだと認識されたのかと…)
などいろいろ考えましたが凡ミスでした。
原因
Controllerの引数で自身で追加したRequestFormを使っているのですが、ViewのFormのパラメータと引数のFormのパラメータがあっていないため認識されていなかったっぽい?です。
(詳細は調べてません。何か気づいたら追記します)
[MasterFormRequest.php]
class MasterFormRequest extends FormRequest
{
public function rules()
{
return [
'id' => ['required','integer'],
'name' => ['required','max:10'],
'discription' => ['required','max:255'],
'icon' => [],
];
}
}
[MasterEditFormRequest.php]
使わなくなったのに引数に指定したままだったForm
必要なIDだけ渡すように作っていましたが、URLパラメータで事足りることに気づき使わなくなりました。
class MasterEditFormRequest extends FormRequest
{
public function rules()
{
return [
'id' => ['required','integer'],
];
}
}
解決
Controllerのeditcomplateで使っているところを、登録処理と同じRequesttForm「MasterFormRequest」で変えたらちゃんと処理が進むようになりました。
あまりの凡ミスに、気付いたときは呆気にとられましたがLaravelの何か特殊な仕様などでなくてよかったです…。