7
2

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の確認画面から戻って入力画面に値を渡すシンプルな方法

Last updated at Posted at 2022-03-19

シンプルな方法、それは…

入力確認画面の修正するボタンに値を持たせて、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()する
これを忘れない。

参考記事

7
2
0

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
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?