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