Laravelのvalidationのメモ

バリデーション 5.6 Laravel

①エラーがあると、前のページにリダイレクトさせたい場合

コントローラー側の基本形 

$request->validate([
  'id' => 'required|alpha_num',
]);

エラーがあると、前のページにリダイレクトする。その際、GETでリダイレクトされるため、前ページは、GETでアクセス可にしておく。

(※初期ページにPOSTが必要な場合、③を見ること)

Route::get(....

 

View側の基本形 

<div class="{{ $errors->has('id') ? ' has-error' : '' }}">
  <input type="text" name="id" value="{{old('id', 初期値)}}">
  @if ($errors->has('bank_name'))
   <span class="help-block">
    <strong>{{ $errors->first('bank_name') }}</strong>
   </span>
  @endif
</div>

 

フォームを囲むDIVのclassに、

{{ $errors->has('id') ? ' has-error' : '' }}

 

を書いておくことで、エラーがあるとフォームに色をつけることができる。

フォームのvalueは、

{{old('id', 初期値)}}

 

としておくことで、エラーで戻ってきた際、元の入力値を受けることができる。

 

エラーメッセージ

laravel/resources/lang/ja/validation.phpに記載する

・属性を変える場合

'attributes'の中に属性のみ追記していく。 

'attributes' => [
  'id' => '会員ID',
],

・メッセージも変える場合

'custom'の中に追記していく。 

 'custom' => [
  'bank_name' => [
   'required' => '銀行名は必須です!',
  ],
],

 

ajaxでリクエストを送信した時は・・・

$request->validate([
]);

ajaxの場合、上記を書いておけば、エラーがあるとリダイレクトせず、バリデーションエラーを全部含んだJSONレスポンスが返される。

そして、ajax

$.ajax({
    type: "POST",
    dataType: "json",
    data: {},
    url: "{{ asset('xxxx') }}",
}).done(function(data){
}).fail(function(res){

    ※ここの部分

});

 fail()にレスポンスが返ってくる(422HTTPステータスで)。

 

確認画面から「戻る」ボタンを押した際、入力値を保存するには・・・ 

confirmのコントローラーに以下を記載

$request->flash();

「戻る」ボタンを押すと、

<form method="GET" action="{{ asset('元のURL') }}">

が実行されるようにしておく。

そうすると、元のページに戻った際、入力値が

{{old('id', 初期値)}}

で取得できている。

 

②エラーがあると、違うページにリダイレクトさせたい場合 

$validator = Validator::make($request->all(), [
  'id' => 'required|alpha_num',
]);
if ($validator->fails()) {
  return redirect('/error');
}

 

 ③初期ページにPOSTでアクセスする必要がある場合

<Route>

初期ページのRouteは、「GET」と「POST」の両方でアクセスできるようにしておく

Route::match(['get', 'post'], 'contact', 'XXXController@index')

 

<コントローラー>

引数に(Request $request)をセットしておく。

初期アクセス時は、$requestに「POST」値が入り、

$request->validate()で、エラーで戻ってきた際は$request値がない。

 

POST値かold値があるかのチェックは以下のようにする。

public function index(Request $request)
{
$id = $request->input('id');
 
//POST値もバリデーションのold値もない場合はエラー
if (!$id && !$request->old('id')) {
return redirect('/error');
}
 
return view('index', compact('id'));

}

 

<blade>

old('id', $id)のように、エラーで戻ってきた際は、フラッシュデータとして保存されているold('id')の値が採用され、

old()がない初期アクセス時は、POSTで送信されてきた$idの値が入る。

<input type="hidden" name="id" value="{{ old('id', $id) }}">

 

 

※フォームが連想配列の場合、「配列形式のフィールドをバリデーションする場合は、*文字を使用し、各配列要素の全メッセージを取得できます。

以下のサイトに例が載っている。

https://qiita.com/horikeso/items/4f8093b0871fba3b4c1d

 

 

 

以上