目的
JavaScriptのSPAアプリからPOSTでJSONをサーバーに送るときに、そのJSONの内容でCRUDを行う前に確認する。
試して失敗したこと
Illuminate\Http\Requestのvalidate関数で下記の通りやってみたら、
$validate = $request->validate([
"title" => ["required", "unique:posts"],
"contents" => ["required"],
]);
JavaScriptアプリ側にValidationが失敗した時に、自動でHTMLのページが送られていたようで、Errorの内容をJSONにて送ることができなくなっていたのです。
解決法
Illuminate\Support\Facades\Validatorを使い、自前でValidatorを作ることにします。
$validator = Validator::make($request->all(), [
"title" => ["required", "unique:posts"],
"contents" => ["required"],
]);
そして、失敗した理由などをJavaScriptアプリにこうやって返せるわけ。
Error Codeも400にすることでアプリ側に何らかのエラーが発生したことが伝わります(社内バックオフィスからマサカリが飛んできたので追記)
$validator = Validator::make($request->all(), [
"title" => ["required", "unique:posts"],
"contents" => ["required"],
]);
if ($validator->fails()) {
return response()->json(["results" => "failed", "errors" => $validator->errors()], 400);
}
JavaScriptではこういうObjectに変換され、UXに活かせる。
まとめ
ということで、自前でValidatorを作ることで、LaravelのValidation機能を利用しつつ、特殊な用途に合わせてJSONを返すこともできるのです。
LaravelはSPAアプリ開発においては非常に上等だということがわかりますね。