#エラーメッセージを表示させる
###はじめに
なにか参考になる人がいればいいですが
基本自分がわかればいいくらいの気持ちで記しているので
ちょいとわかりにくい表現になってたり
本ページの構成も適当になってたり、
すると思います。
では本題へ
<form action="/hello" method="post">
<table>
@csrf
@error('name')
<tr><th>エラー!</th>
<td>{{($message)}}</td></tr>
@enderror
<tr><th>名前: </th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
.
.
.
.
@error('name') 「name」にエラーがあるかチェックできる。
##フォームリクエスト
今まではコントローラーにバリデーションが設置されていたけど
「クライアントが送信したフォームがリクエストされる」
そのリクエストの時にバリデーションを設置した方がいいらしい。
フォームリクエストを作成する
php artisan make:request ○○Request
○○は好きに設定
Http/Requests/○○Request.php
が作成される。
この中にフォームリクエストを作成していく
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ○○Request extends FormRequest
{
public function authorize()
{
return false;
}
public function rules()
{
return [
//
];
}
}
rules 適用されるバリデーションの検証ルールを設定する。
これで指定されたルールを元にバリデーションチェックが実行される。
class ○○Request extends FormRequest
{
public function authorize()
{
if ($this->path() == '○○')
{
return true;
} else {
return false;
}
}
public function rules()
{
return [
'name' => 'required',
'mail' => 'email',
'age' => 'numeric|between:0,150',
];
}
}
○○以外から利用できないようにする
フォームリクエスト学習以前は
コントローラーに検証ルールを書いていたけど
○○Request.php
にもう記入したので書き直す
// use App\Http\Request\○○Request;
public function post(○○Request $request)
{
return view('▷▷.index',['msg'=>'正しく入力できています。']);
}
post()の中が 「○○ $request」となっている
〇〇Requestで設定したバリデーションが
これで実行される。
##メッセージをカスタマイズしていく
このままだとデフォルトでついている(?)エラー文が
吐き出されるので(しかも英文)以下を追加。
public function messages(){
return[
'name.required' => '名前は必ず入力してください',
'mail.email' => 'メールアドレスが必要です' ,
'age.numeric' => '年齢を整数で記入してください',
'age.between' => '年齢は0〜100の間で入力してください',
];
}
検証ルールごとにエラーになった場合に
それぞれメッセージを設定する。
記述がないとデフォルトの英文が使われるよう。
##バリデータの作成
今まではエラーがあったら必ずフォームにもどるような処理に
なっていたけど(Request.phpのなかのFormRequestに用意されている処理)
場合によっては
フォームに戻らないようにしたいとか
エラーが起きたときに別の処理を行いたいとか
あったりする。
その時に バリデータ を用意する。
// use Validator; を追記
public function post(Request $request){
$validator = Validator::make($request->all(),[
'name' => 'required',
'mail' => 'email',
'age' => 'numeric|between:0,150',
]);
if ($validator->fails()){
return redirect('/hello')
->withErrors($validator)
->withInput();
}
return view('hello.index',['msg'=>'正しく入力されました!']);
}
validator = Validator::make( 値の配列 , ルールの配列 );
第1引数には、チェックする値をまとめた配列を用意する。
複数あるフォーム全体をチェックしたいのであれば
allで全部指定。
第2引数には、検証ルールを。
if ($validator->fails()) {エラーの時の処理}
この「fails」は、バリデーションでエラーが発生しているかどうか
調べるもの。
「true」ならばエラーが発生しているということ。
エラーの処理が発生し
returnで「/hello」が呼び出されている。
「/hello」を呼び出すだけではエラー文など
表示されないので
エラーメッセージとフォームの入力情報を
表示させないといけない。
withErrors
でValidatorインスタンスを渡している。
Validatorで発生したエラーメッセージを
リダイレクト先まで引き継ぐことができる。
withInput
は送信されてきたフォームの値をそのまま引き継ぐ。
###エラーメッセージをカスタマイズ
ここでバリデータを作ったときに
エラーメッセージがデフォルトにもどってしまっているので
カスタマイズしていく
validator = Validator::make(値の配列,ルール配列,メッセージ配列,)
のようにバリデータを作る時(?)に作れるっぽい。
第3引数に指定。
public function post(Request $request)
{
$rules = [
'name' => 'required',
'email' => 'email',
'age' => 'numeric|between:0,150',
];
$messages = [
'name.required' => '名前は必ず入力してください',
'mail.email' => 'メールアドレスを入力してください',
'age.numeric' => '年齢を整数で記入してください',
'age.between' => '年齢は0〜100の間で入力してください',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect('/hello')
->withErrors($validator)
->withInput();
}
return view('hello.index', ['msg'=>'正しく入力されました!']);
}
$rules $messages にそれぞれルールと
エラーメッセージを入力している。
それを第2、3引数に指定する。
これでエラーメッセージのカスタマイズ完了。
今日はここまで〜〜。お疲れ様です。