シンプルな方法、それは…
入力確認画面の修正する
ボタンに値を持たせて、redirect()->withInput()
を使うだけ
コード & 解説
ルーティング処理
Route::get('/form/','Form\FormController@index');
Route::post('/form/confirm/','Form\FormController@confirm');
Route::post('/form/complete/','Form\FormController@complete');
コントローラー
-
index
: 入力画面の処理 -
confirm
: 入力確認画面の処理 -
complete
入力完了画面の処理
<?php
namespace App\Http\Controllers\Form;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class FormController extends Controller
{
public $form_data = [
["name", "text"],
["age", "text"],
["email", "email"],
];
public function index()
{
return view('/form/index',[
'form_data' => $this->form_data,
]);
}
public function confirm(Request $request)
{
$validation_array = [
'name' => 'required | string',
'age' => 'required | numeric',
'email' => 'required | email',
];
$validator = Validator::make($request->all(), $validation_array);
if ($validator->fails()) {
return redirect('/form/')
->withErrors($validator)
->withInput();
};
$input_data = [
["name", $request->input('name')],
["age", $request->input('age')],
["email", $request->input('email')],
];
return view('form/confirm',[
'input_data' => $input_data,
]);
}
public function complete(Request $request)
{
if($request->input('back') == 'back'){
return redirect('/form/')
->withInput();
}
return view('form/complete');
}
}
ポイント
if($request->input('back') == 'back'){
return redirect('/form/')
->withInput();
}
入力確認画面における入力画面に戻る
ボタンに値を持たせて、その値が送られてきたら、Laravelの redirect()
を使用して、入力画面に遷移している。
withInput()
で入力画面に渡し、入力画面では old()
を使用して、画面に表示できる。
処理の流れとしては、バリデーションエラーを表示するときと同じ なので、入力画面に戻る
ボタンに値を設定することを忘れずに覚えておく。
View
フォームの中身だけを記述していく。
<form method="POST" action="/form/confirm">
<table>
<tr>
<th>名前</th>
<th>年齢</th>
<th>メールアドレス</th>
</tr>
<tr>
@foreach($form_data as $value)
<td>
<input name="{{ $value[0] }}" type="{{ $value[1] }}" value="{{ old($value[0]) }}">
@if($errors->has($value[0]))
<p style="color: red;">{{ $errors->first($value[0]) }}</p>
@endif
</td>
@endforeach
<td><button type="submit">確認画面へ</button></td>
</tr>
</table>
@csrf
</form>
<form method="POST" action="/form/complete">
<table>
<tr>
<th>名前</th>
<th>年齢</th>
<th>メールアドレス</th>
</tr>
<tr>
@foreach($input_data as $value)
<td>{{ $value[1] }}</td>
<input name="{{ $value[0] }}" type="hidden" value="{{ $value[1] }}">
@endforeach
</tr>
<tr>
<td><button type="submit" name='back' value="back">修正する</button></td>
<td><button type="submit" name='submit' value="complete">入力完了画面へ</button></td>
</tr>
</table>
@csrf
</form>
<div>
<p>入力が完了しました</p>
</div>
<div>
<a href="/form/">入力画面に戻る</a>
</div>
ポイント
入力画面
<input name="{{ $value[0] }}" type="{{ $value[1] }}" value="{{ old($value[0]) }}">
value="{{ old($value[0]) }}"
で入力確認画面から戻ってきたときの値を受け取る。
バリデーションに引っかかった時の値の保持にも使うので、忘れることはまずないと思うが、重要な事に変わりはないので書いておく。
入力確認画面
<input name="{{ $value[0] }}" type="hidden" value="{{ $value[1] }}">
入力確認画面でも input
を忘れない。
これを忘れると、complete()
での入力画面に戻る処理の際、withInput()
で渡せる値が見つからなくなる。
hidden
で良いので、input
を欠かさずに記載する。
<td><button type="submit" name='back' value="back">修正する</button></td>
この記事の最大のポイント。
入力画面に戻る
ボタンに値を設定して、入力完了画面の処理で入力画面にredirect()->withInput()
する
これを忘れない。