質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3767閲覧

【laravel8】1つの画面に複数のformがあり、異なるcontrollerに遷移し、同じ画面に戻る方法

ra-n

総合スコア17

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/05/31 06:33

編集2021/06/02 02:14

前提・実現したいこと

laravel8で開発しています。
1つの画面に複数のformがあります。

formごとに別のcontrollerで処理をして
同じ画面を再表示したいです。

通信は全てpostで行いたいです。

試したこと

formの遷移先はweb.phpで行うのかと思いましたが

web.php

1Route::get('/index', [App\Http\Controllers\HomeController::class, 'index'])->name('index'); 2Route::post('/index', [App\Http\Controllers\UsersController::class, 'update'])->name('profile')->middleware('verified'); 3Route::post('/index', [App\Http\Controllers\BanksController::class, 'update'])->name('bank.update')->middleware('verified'); 4

のように同じpostで第一引数に同じ値を入れるとエラーになります。
(これがどうしてできないのかは理解しています。)

web.phpではなくリダイレクトを使うのか?と考え、

Controller

1class BanksController extends Controller 2{ 3 public function update(Request $request) 4 { 5 return redirect()->route('index'); 6 } 7}

とするのかと思ったのですが、
formからControllerのfunctionを指定してsubmitする方法がわかりませんでした。


解決方法

教えていただいた回答からこのように作ったという解決ソースを記載しておきます。

web.php

1Route::get('/index', [App\Http\Controllers\HomeController::class, 'index'])->name('index'); 2Route::post('/user/update', [App\Http\Controllers\UsersController::class, 'update'])->name('profile')->middleware('verified'); 3Route::post('/bank/update', [App\Http\Controllers\BanksController::class, 'update'])->name('bank.update')->middleware('verified'); 4 5//おまけ:各formのidを指定して、各formが表示されるように追加 6Route::get('/index#profile', [App\Http\Controllers\HomeController::class, 'index'])->name('index.profile'); 7Route::get('/index#bank', [App\Http\Controllers\HomeController::class, 'index'])->name('index.bank'); 8

※ポイント
/user/update
/bank/update
の部分は何でもいい。仮に名前をつけただけ。

UsersController

1class UsersController extends Controller 2{ 3 public function update(Request $request) 4 { 5 return redirect()->route('index.profile'); 6 } 7}

BanksController

1class BanksController extends Controller 2{ 3 public function update(Request $request) 4 { 5 return redirect()->route('index.bank'); 6 } 7}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

formからControllerのfunctionを指定してsubmitする方法

これはbladeファイルで下記のように記載すれば指定できます。

php

1<form action="{!! route('profile') !!}" method="POST" >

htmlのフォームの送信はあくまでURLに対して行う動作で、コントローラのメソッドにPOSTするのではなくルーティングで設定されたURLに行われます。
それをコントローラのメソッドで受け取って処理しているだけです。

また、Laravelの仕様上URLのパターンは上から検索されるため、サンプルコードの記述だと/index にPOSTされたものは全て UsersControllerupdateメソッドで処理されます。BanksControllerupdateメソッドには決して辿りつきません。

つまり、POSTを受け取るURLは処理ごとに全て分けるべきで、サンプルコードのように1つのURLで複数の処理を受け取ることはできません。

投稿2021/06/01 06:20

Tatsuki-sth

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-n

2021/06/02 02:00

ご回答ありがとうございました。 コントローラーのファンクションを指定という考え方ではなく、 コントローラーのファンクションに行くというルートに名前を付ける必要がある ということが分かりました。
guest

0

同じ URI で同じ Verb って区別化できないはずから提示されたコードでは正しいルーティングができていないと思う。

php artisan route:list を行い、適切に設定できているのかまず確認する。

回答としては、 URI を明示的に変えてあげればいいと思います。

投稿2021/06/01 01:01

kai0310

総合スコア2076

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-n

2021/06/01 03:46

コメントありがとうございます。 ```web.php Route::post('/user/update', [App\Http\Controllers\UsersController::class, 'update'])->name('profile')->middleware('verified'); Route::post('/bank/update', [App\Http\Controllers\BanksController::class, 'update'])->name('bank.update')->middleware('verified'); ``` と、変えようとしたのですが これだと同じ画面に戻る処理をどのように実装すればいいかわかりませんでした。 同じ画面に戻ることは出来ますか?
kai0310

2021/06/02 03:03 編集

処理を行なったあたと、return back();
kai0310

2021/06/01 13:12

具体的なコードを求めているのであれば、まず質問で具体的なコードを提示してください。
ra-n

2021/06/02 01:57

ご回答ありがとうございます。 return back(); や return back()->withInput(); では戻れませんでした。 別のやり方で解決したのでそちらを追記させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問