Laravelの確認画面から戻って入力画面に値を渡すシンプルな方法

## シンプルな方法、それは…
入力確認画面の`修正する`ボタンに値を持たせて、**`redirect()->withInput()`** を使うだけ


## コード & 解説

### ルーティング処理

```\routes\web.php
Route::get('/form/','Form\FormController@index');
Route::post('/form/confirm/','Form\FormController@confirm');
Route::post('/form/complete/','Form\FormController@complete');
```

### コントローラー
- `index`: 入力画面の処理
- `confirm`: 入力確認画面の処理
- `complete` 入力完了画面の処理


```\app\Http\Controllers\Form\FormController.php

<?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');
    }
}

```

#### ポイント

```FormController.php
if($request->input('back') == 'back'){
    return redirect('/form/')
                ->withInput();
 }
```

入力確認画面における`入力画面に戻る`ボタンに値を持たせて、その値が送られてきたら、Laravelの **`redirect()`** を使用して、入力画面に遷移している。
`withInput()`で入力画面に渡し、入力画面では **`old()`** を使用して、画面に表示できる。
**処理の流れとしては、バリデーションエラーを表示するときと同じ** なので、`入力画面に戻る`ボタンに値を設定することを忘れずに覚えておく。

### View

フォームの中身だけを記述していく。

```\resources\views\form\index(.blade).php
<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>
```

```\resources\views\form\confirm(.blade).php
<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>
```

```\resources\views\form\complete(.blade).php
<div>
    <p>入力が完了しました</p>
</div>
<div>
    <a href="/form/">入力画面に戻る</a>
</div>
```


#### ポイント

##### 入力画面
```inde(x.blade).php
<input name="{{ $value[0] }}" type="{{ $value[1] }}" value="{{ old($value[0]) }}">
```

**`value="{{ old($value[0]) }}"`** で入力確認画面から戻ってきたときの値を受け取る。
バリデーションに引っかかった時の値の保持にも使うので、忘れることはまずないと思うが、重要な事に変わりはないので書いておく。

##### 入力確認画面

```confirm(.blade).php
<input name="{{ $value[0] }}" type="hidden" value="{{ $value[1] }}">
```
入力確認画面でも **`input`** を忘れない。
これを忘れると、`complete()`での入力画面に戻る処理の際、`withInput()`で渡せる値が見つからなくなる。
`hidden`で良いので、`input`を欠かさずに記載する。


```confirm(.blade).php
<td><button type="submit" name='back' value="back">修正する</button></td>
```
この記事の最大のポイント。
**`入力画面に戻る`ボタンに値を設定して、入力完了画面の処理で入力画面に`redirect()->withInput()`する**
これを忘れない。

## 参考記事
- [バリデーション 8.x Laravel](https://readouble.com/laravel/8.x/ja/validation.html)
- [【Laravel】requestを使用して画面で入力した内容を遷移後の画面に表示する方法 - らるブログ](https://www.raruspeer.com/entry/2019/02/24/%E3%80%90Laravel%E3%80%91request%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E7%94%BB%E9%9D%A2%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%82%92%E9%81%B7%E7%A7%BB%E5%BE%8C%E3%81%AE)
- [入門者のためのLaravelのバリデーションとエラーメッセージ | アールエフェクト](https://reffect.co.jp/laravel/laravel_validation_understanding)