web-dev-qa-db-ja.com

REST API in Laravelリクエストの検証時

現在、Laravel=を使用してRESTful APIを構築する方法を試しています。現在、新しいユーザーを作成しています。これは単なるテストであり、いくつかの結果が得られています。 Laravelの検証を使用してリクエストを検証しようとすると、結果は次のとおりです。

enter image description here

私はこのコードで新しいものを作成しようとしています:

_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形式で検証を取得する方法はありますか?

31
Aoi

おそらくエラー(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."]
    }
}
25
Jason Lewis

これらのコードは私のために働いて、あなたを助けます。

$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);
    if ($validator->fails()) {
        $response['response'] = $validator->messages();
    }else{
//process the request
}
return $response;
22
bhupendraosd

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レスポンスを返します。

4
zak.http

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)
});
2
mwal