LoginSignup
12
10

More than 3 years have passed since last update.

Laravelのバリデーションでエラー時の遷移先を制御する

Posted at

問題

  • Laravelのバリデーションでエラーになった際、入力時のページに戻らない
  • Laravelのバリデーションでエラーになった際に入力時のページへ戻る際、値は保持されない

原因

Laravelでバリデーションを適用した際、エラー発生時に入寮時の画面などに戻る際、GETメソッドで遷移されるから

自分はRequestvalidateメソッドを利用し、バリデーションを適用していたため、ルールやエラーメッセージなどの設定はできても、その後の制御ができておらず、冒頭のような問題が発生していた。
バリデーション 5.5 Laravelを見ると、Request以外にもバリデーションを設定できる方法があったので、それを試してみたら問題が解決したので、その方法を記載する。

解決策

validatorを利用する

validator

validatorはコントローラに直接記入して利用する。
基本となるのはこの形。

app/Http/Controllers/SampleController.php
use Validator;

class SampleController extends Controller
{
    public function sample(Request $request)
    {
        $validator = Validator::make($request->all(), [
                //バリデーションルールの記入
            ],
            [
                //エラーメッセージの記入
            ]);

        if ($validator->fails()) {
            return redirect('home')
                        ->withErrors($validator)
                        ->withInput();
            //エラー時の処理
        }
        //バリデーションが通った時の処理
    }
}

Validator::makeRequestValidateメソッドと同じように、バリデーションルールやエラーメッセージを指定する。
Validator::makeで宣言したバリデーションルールを満たさなかった場合、$validator->fails() {}が実行される。

  • redirect: 遷移先の指定
  • withErrors($validator): 遷移先に$validatorを渡す。
  • withInput(): 遷移先にInputがあり、渡したい値があれば、ここに指定。

Validatorを使ってリダイレクト先を指定することで、遷移先ページの指定は解決しそう。
ちなみに、リダイレクト先の指定はroutes\web.phpname()で指定した値も指定できる。

routes\web.php
Route::get('/home', 'HomeController@index')->name('home');

Validatorのカスタマイズ

情報編集画面 → 情報編集確認画面編集完了画面みたいな流れでLaravelのプロジェクトを作成していたとする。
その際、先程のredirect()だと渡せる情報に限界がある場合などが考えられる。
しかし、$validator->fails() {}で指定できるのはredirect()だけではない。
その例を以下に記載する。

app/Http/Controllers/EditCheckController.php
use Validator;

class EditCheckController extends Controller
{
    public function sample(Request $request)
    {
        $validator = Validator::make($request->all(), [
                'name' => 'required|max:20',
                'email' => 'required|email',
                'body' => 'required',
                'delete_flag' => 'boolean',
                //バリデーションルールの記入
            ],
            [
                'name.required' => '名前を入力してください。',
                'name.max' => '名前は20字以内で入力してください。',
                'email.required' => 'Eメールを入力してください。',
                'email.email' => 'Eメールはメールアドレス形式で入力してください。',
                'body.required' => '本文を入力してください。',
                'delete_flag.boolean'  => '0か1を入力してください。',
                //エラーメッセージの記入
            ]);

        if ($validator->fails()) {
            $edit_id = $request -> input('edit_id');
            $name = $request -> input('edit_name');
            $email = $request -> input('edit_email');
            $body = $request -> input('edit_body');
            $delete_flag = $request -> input('edit_delete_flag');
            $edit_data = User::where('id', $edit_id) -> first();
            $edit = array(
                'id' => $edit_id,
                'name' => $name,
                'email' => $email,
                'works_id' => $body,
                'created_at' => $edit_data['created_at'],
                'updated_at' => $edit_data['updated_at'],
                'delete_flag' => $edit_delete_flag
            );
            $back_url = "location.href='/home'";
            return view('edit',['User' => $edit, 'Back' => $back_url])
                -> withErrors($validator);
            //エラー時の処理
        }
        //バリデーションが通った時の処理
    }
}

まるでひとつのコントローラーの処理のようになっているが、このような書き方もできる。
view()を指定した書き方によって、GETメソッド以外による情報を保持してのページ遷移が可能となった。

エラー時における入力値の保持

redirect()以外によるページ遷移と値の保持の仕方を紹介したが、ならredirect()の際はどうやって値を保持すれば良いのか。
withInput()を使用するのも一つの手だが、Laravelではoldヘルパというものが使用できる。
使い方は~.blade.php<Input>などのvalue{{ old('name属性') }}を記入するだけ。

また、oldヘルパでは初期値も設定できる。
データベースの値を初期値にしたい場合は第二引数にその値を設定する。

sample.blade.php
<td><input type="text" name="edit_text" value="{{ old('edit_text', $db->text) }}" ></td>

参考文献

12
10
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
12
10