1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】リダイレクトしようとしたら同じURLにしか飛ばなくなった時の備忘録

Last updated at Posted at 2022-08-20

事象

処理後のリダイレクトをしたいのに、今いる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の何か特殊な仕様などでなくてよかったです…。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?