[0007]Validatorファザードを利用したバリデーション

■Validator

今回は、フォームリクエストバリデーションではなく、Validatorファザードをコントローラ(Controller)で利用しようと思います。

この例ではコントローラ(Controller)名が[Test]です。Lalavelフレームワークのバージョンは5.5です。

TestController.php

              
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Validator;

class TestController extends Controller
{
public function confirm(Request $request)
    {
        $all_req = $request->all();
        $v = Validator::make($all_req,$this->setRule($all_req),$this->setRuleMessage($all_req));
        if ($v->fails()) {
            return redirect('/form')->withErrors($v)->withInput($all_req);
        } else {
            return view('confirm')->with('paraArrs',$all_req);
        }
        return redirect('/form');
    }
    private function setRule($all_req)
    {
        $ruleArr = [];
        $ruleArr['name'] = 'required|max:30';
        $ruleArr['tel'] = 'required|digits:11';
        return $ruleArr;
    }

    private function setRuleMessage($all_req)
    {
        $messageArr = [];
        $messageArr['name.required'] = '・担当者氏名:必須です';
        $messageArr['name.max'] = '・担当者氏名:最大:max文字までに入力してください.';
        $messageArr['tel.required'] = '・電話番号:必須です';
        $messageArr['tel.digits'] = '・電話番号:数字11桁ハイフンなしを入力してください.';
        return $messageArr;
    }
}

              
            

Validatorファザードを利用する場合はuse Validator;で利用できるようにします。

この例ではconfirm関数内でrequest情報を元にValidator::make($all_req,$this->setRule($all_req),$this->setRuleMessage($all_req));Validatorを作成しています。

setRule関数でバリデーション内容を、setRuleMessage関数でメッセージ内容を用意しています。

使用可能なバリデーションルールは多数あります。参考ページ→https://readouble.com/laravel/5.5/ja/validation.html#rule-regex

if ($v->fails()) {エラーがある場合はTRUEです。return redirect('/form')->withErrors($v)->withInput($all_req);エラー情報を保持しhttps://ドメイン名/form 画面へ戻ります。

エラーがない場合は次の処理へ移ります。この例ではconfirmという名前のViewを表示しています。

これで完成です!!エラーがある場合、戻り値を利用してエラーメッセージを表示するView側のサンプルは以下になります。この例ではView名は[form]です。一部抜き出しています。

form.blade.php

              
{{-- 全体的なメッセージ --}}
@if ($errors->any())
    <div class="alert alert-danger">
         <ul>
            <li>※入力に不備がございます。お手数ですがご確認ください.</li>
          </ul>
     </div>
@endif

{{-- 個々のフィールドにメッセージ --}}
<tr>
   <th>担当者氏名<span class="required">必須</span></th>
       <td>
           <?php $class="medium";
               if ($errors->has('name')){
                   $class = "medium error_input";
               }
           ?>
           {!! Form::text('name',null, ['class'=>$class,'id' => 'name','placeholder'=>'例)山田 太郎','required']) !!}
           @foreach ($errors->get('name') as $message)
		   <p class="error">{{$message}}</p>
	   @endforeach
      </td>
</tr>
              
            

「全体的なメッセージ」は@if ($errors->any())でエラーが1件でもある場合にTRUEになりメッセージを表示します。

「個々のフィールドにメッセージ」はif ($errors->has('name')){特定のフィールドのエラーだけ確認しています。[name]はフィールド名が入ります。この例では名前にエラーがあるか確認し、スタイルシートを変更しています。

@foreach ($errors->get('name') as $message) <p class="error">{{$message}}</p> @endforeachで名前フィールドのエラーをループし、名前フィールドのみのエラーメッセージを全て表示するようにしています。

少しでも参考になれば幸いです♪