質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

941閲覧

laravel REST API での validation のエラー処理について

akasatanaha

総合スコア44

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/09/04 02:15

laravel初心者です。

laravel validation を使ってREST API のエラーコードを返却したいのですが
laravel でどう実装するのがよいのかご教示願えますでしょうか。

どういうプロジェクト
かというと
laravel を使ってios,androidのゲームアプリを開発しております。
REST API でクライアントでやり取りするのですが
validationエラーのときにエラーコードを返却します。

WEBであれば、laravelの基本機能のままにエラーがあれば
全てのエラーメッセージを返却して終わりかと思いますが
今回の要件としては
エラーがあったら、その場でエラーコードを返却したいと思っております。
(最悪laravelでデフォルトで入っているvalidation全走査して、全エラー返してもいいですが)

例えば
user_id がない エラーコード:100
user_id が数字でない エラーコード:101
item_id がない エラーコード:200
のような感じです。

またDBデータ取得してvalidationチェックするようなものも
いちいちService化?もしくはvalidation化するものなのでしょうか?
例)
フレンドは100人以上登録できません エラーコード:501

説明が分かりにくいかもしれませんが
何卒よろしくお願いいたします。

環境:laravel5.4
もしくは5.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

バリデーションの仕組みを使うのであれば、
基本的なバリデーションの後にafterフックで任意のバリデーションを行い、エラーの場合は$validator->errors()->add()で追加すれば個別のServiceやカスタムバリデーション定義は必要ないです。
Laravel 5.4 バリデーション

$validator->after(function ($validator) { if ($this->somethingElseIsInvalid()) { $validator->errors()->add('field', 'フレンドは100人以上登録できません エラーコード:501'); } });

文言の変更だけならばエラーメッセージのカスタマイズで文言を変えたりも出来ます。

public function messages() { return [ 'user.xxxx' => 'フレンドは100人以上登録できません エラーコード:501', ]; }

APIのエラーの基本的な考え方に関してであれば、naga3さんのリンクがわかりやすいかと思います。

投稿2017/09/04 04:50

編集2017/09/04 04:54
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akasatanaha

2017/09/04 05:11 編集

ご回答ありがとうございます。 $validator->errors() に add 出来ることを知りませんでした これはこれで使えそうです。 ただこれは message のデータに付加するものなので 自分の求めているものと少し違いました。 やっぱり通常の validation 機構だと難しいのかもしれないですね。
akasatanaha

2017/09/04 07:49

なるほどこういう手もあるのですね。普通のWEBサイトとかであれば、 これも使えそうですね。 ご教示ありがとうございます!
aro10

2017/09/04 10:05

あとは、throwでエラーを発生させた場合はapp/Exceptions/Handlerのrenderでエラーを捕まえれるので、そこでエラークラスに合わせたレスポンスを行うという方法も考えられます。 5.5からはエラークラスにrenderを付けるとより完結にエラー専用の処理を書けるようになりました。 [Laravel 5.5 リリースノート Reportable/Renderable例外](https://readouble.com/laravel/5.5/ja/releases.html) [Best way to handle REST API errors thrown from Controller or Exception](https://laracasts.com/discuss/channels/code-review/best-way-to-handle-rest-api-errors-throwed-from-controller-or-exception)
akasatanaha

2017/09/05 04:55

なるほど。 エラークラスを分けて render もいいかもしれませんね。 わざわざ5.5のリリースノートまで見てもらってありがとうございます! ご教示ありがとうございます!
guest

0

REST APIならまず返すステータスコードは統一しておいたほうが良いと思います。

参考 RESTful API設計におけるHTTPステータスコードの指針

返却する形式は自由ですが、分かりやすい形式で。

参考 WebAPIでエラーをどう表現すべき?15のサービスを調査してみた

モジュール化などはご自由にどうぞ。

投稿2017/09/04 04:47

naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akasatanaha

2017/09/04 05:07

ご回答ありがとうございます。 REST API でのステータスコードについては認識しております。 今回の例で言いますと 通信は成功HTTPステータスコードは200 だけれども 「フレンドは100人以上登録できません」の場合に エラーコード:501 のような。 と、エラーコード501でご説明したのが誤解を招きましたね。 失礼しました。 90501とかでご説明しておけばよかったです。 いずれにせよ、参考URLもお教えいただきありがとうございます! 参考にしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問