[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で名前フィールドのエラーをループし、名前フィールドのみのエラーメッセージを全て表示するようにしています。
少しでも参考になれば幸いです♪