現在、Laravel=を使用してRESTful APIを構築する方法を試しています。現在、新しいユーザーを作成しています。これは単なるテストであり、いくつかの結果が得られています。 Laravelの検証を使用してリクエストを検証しようとすると、結果は次のとおりです。
私はこのコードで新しいものを作成しようとしています:
_public function store()
{
$validation = Validator::make(Request::all(),[
'username' => 'required|unique:users, username',
'password' => 'required',
]);
if($validation->fails()){
} else{
$createUser = User::create([
'username' => Request::get('username'),
'password' => Hash::make(Request::get('password'))
]);
}
}
_
しかし、検証でエラーを返す方法がわかりません。しかし、validation->fails()
でifを実行しようとしたときに、画像に表示されているHTMLが引き続き表示されます。 JSON形式で検証を取得する方法はありますか?
おそらくエラー(Illuminate\Support\MessageBag
のインスタンス)を返し、エンコードする必要があります。 MessageBag
インスタンスを使用すると、JSON表現に直接変換できます。
$errors = $validation->errors();
return $errors->toJson();
今では自分のホーンを鳴らすのではなく、最近、LaravelのためのRESTful APIパッケージを開発しました。 dingo/api パッケージおよびWiki returning errors 。基本的に、エラーを返す代わりに例外をスローします。
throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());
次のJSONで表されます。
{
"message": "Could not create a new user.",
"errors": {
"username": ["The username is already in use."]
}
}
これらのコードは私のために働いて、あなたを助けます。
$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
$response['response'] = $validator->messages();
}else{
//process the request
}
return $response;
Laravelは、コントローラーから呼び出すことができる検証メソッドをすぐに提供します。
Laravel Controller
抽象クラスをチェックすると、ValidatesRequests
というトレイトを使用していることがわかります。
_ abstract class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
_
そのため、コントローラークラスがコントローラーを拡張する限り、メソッド$this->validate(Request $request, array $rules);
を使用できます。
完全なメソッド宣言は
_public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
{
$validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
if ($validator->fails()) {
$this->formatValidationErrors($validator);
}
}
_
$ validatorが失敗した場合、メソッドはリクエストタイプに応じてエラーをスローし、それがajaxである場合(この場合、リクエストヘッダー(_Accept application/json
_)に含める必要があります)は、検証エラーを含むJSONレスポンスを返します。
laravel 5.5以降、ドキュメントを参照してください: AJAX Requests&Validation
TL; DR:検証に失敗すると、検証エラーメッセージとともに422を含むjson応答が返されます。応答オブジェクトでこれらの検証エラーを見つけるのに少し時間がかかったので、axiosを使用している場合にエラーメッセージを表示するには、ブラウザーコンソールでこれを試してください。
axios.post('/api/your-route-here')
.then(response => {
console.log(response.data);
}).catch(error => {
console.log(error.response.data.errors)
});