A Laravel(バリデーション) - user000422/0 GitHub Wiki
基本情報
公式: https://readouble.com/laravel/11.x/ja/validation.html 標準のvalidateメソッドを使う方法は応用が全く効かないので非推奨。 全部フォームリクエストでいいじゃんと思うでしょ?GETに対応してない時点で論外なのよ。POSTは良いと思う。
バリデーションルール
maxは半角1文字も全角1文字も「1」としてカウント。
実践
Validatorファサード型。makeメソッドで自由な処理が可能。
// 参考書式
use Illuminate\Support\Facades\Validator;
public function store(Request $request)
{
// バリデーションルールの定義
$rules = [
'name' => 'required|max:20',
'email' => 'required|email|max:255',
'age' => 'integer',
'title' => 'required|unique:posts|max:255',
'publish_at' => 'nullable|date',
];
// バリデータインスタンスでバリデーションを実施
$validator = Validator::make($request->all(), $rules);
// バリデーション失敗
if ($validator->fails()) {
// TODO
}
// バリデーション済みデータの取得
$validated = $validator->validated();
}
Request(フォームリクエストバリデーション)
Controllerからバリデーション処理を分離(カプセル化する)目的。 バリデーションチェックを行う。 Controllerから呼び出される。 デフォルト状態で失敗すると403で直前の画面にリダイレクト。 ★POST用の仕組みのためGETに使わないことにする。GETで使えるようにするのは面倒すぎる。
public function authorize(): bool
{
return true; // falseのままで使用するとエラー
}
public function rules()
{
// required : 入力必須, nullable : 入力任意
// numeric : 数字
// max:num : 最大桁数
// between:num_min,num_max : 桁数範囲指定
return [
'name' => 'required|max:16',
'age' => 'numeric|between:0,120',
'name' => 'required|string|confirmed|min:8',
];
}
// エラーメッセージをカスタムする場合は「messages」をオーバーライド
public function messages()
{
return [
'name.required' => '名前は必須です。',
'password.min' => 'パスワードは8桁以上です。',
];
}
// バリデーションエラー後のレスポンスをカスタム「」をオーバーライド
// 必須: use Illuminate\Contracts\Validation\Validator;
// 必須: use Illuminate\Http\Exceptions\HttpResponseException;
protected function failedValidation(Validator $validator)
{
$response = response()->json([
'status' => 'error',
'message' => $validator->errors()
], 422);
throw new HttpResponseException($response);
}
// ★GETのクエリパラメータをバリデーションしたい場合
public function validationData()
{
$name = $this->query('name');
return array_merge($this->all(), compact('name '));
}
Controllerにてフォームリクエストバリデーションの呼び出し設定。
use App\Http\Requests\SampleRequest;
public function sample(SampleRequest $request)
{
// バリデーション済みデータの取得
$validated = $request->validated();
$email= $validated['email'];
}
viewでエラーメッセージを設定。
<!-- errorディレクティブ -->
@error('name')
<p>{{ $message }}</p> <!-- ここにエラーメッセージ 名称は「message」で固定 -->
@enderror
<!-- old : エラーによるリダイレクト前の入力値を保持する。 -->
<input type="text" value="{{ old('name') }}" name="name">
応用
■パラメータでバリデーションルールを分けたい
public function rules(): array
{
$flg = e($this->input('flg'));
// 共通
$rules = [
'' => '',
];
// 分岐
if ($flg) {
$rules['color'] = 'required';
}
return $rules;
}