2017-09-16 4 views
0

私は期待した応答が得られません。カスタムメッセージが提供されても、検証が失敗してもデフォルトのエラーメッセージが返されます

この場所のWebサービス要求のためのコントローラのコードです:

<?php 
namespace App\Http\Controllers; 

use App\Location; 
use Illuminate\Http\Request; 


class LocationController extends Controller 
{ 


    /** 
    * Action method to add a location with the supplied Data 
    * 
    * @param \Illuminate\Http\Request $p_oRequest Request 
    * 
    * @return JSON 
    */ 
    public function add(Request $p_oRequest) 
    { 

     try { 

      $p_oRequest->validate(
       array(
        'name' => 'required|alpha_num', 
        'user_id' => 'required|integer', 
       ), 
       array(
        'name.required' => 'Name is required', 
        'name.string' => 'Name must be alphanumeric', 
        'user_id.required' => 'Curator User Id is required', 
        'user_id.required' => 'Curator User Id must be an integer', 
       ) 
      ); 

     } catch (\Exception $ex) { 

      $arrResponse = array(
       'result' => 0, 
       'reason' => $ex->getMessage(), 
       'data' => array(), 
       'statusCode' => 404 
      ); 

     } finally { 

      return response()->json($arrResponse); 

     } 

    } 

} 

要求がhttp://mydomain/index.php/api/v1/location/[email protected]です^

私が期待した応答の理由がある:!{ "結果":0、「理由": "名前は英数字でなければなりません"、 "データ":[]、 "からstatusCode":404}

I代わり得る実際の応答がある:{ "結果":0、 "理由":" 与えられたデータました無効 "、"データ ":[]、" statusCode ":404}

助けてください。これは私を悩ましている。

答えて

0

あなたのメッセージは、検証ルールも、その代わりに、必要があります:あなたが持っている必要があり

'name.required' => 'Name is required', 
'name.string' => 'Name must be alphanumeric', 
'user_id.required' => 'Curator User Id is required', 
'user_id.required' => 'Curator User Id must be an integer', 

:私はついに発見した

'name.required' => 'Name is required', 
'name.alpha_num' => 'Name must be alphanumeric', 
'user_id.required' => 'Curator User Id is required', 
'user_id.integer' => 'Curator User Id must be an integer', 
+0

それでも問題は解決しませんでした。明らかに、それは他のLaravel開発者が経験する問題です。 https://github.com/laravel/framework/issues/21059 – user3125602

+0

いいえ、無効な​​メッセージを設定してください。 'alpha_num'バリデーションルールを使用したときは、' name.alpha_num'を使って有効にしてください。だからあなたは何か間違っているか、あなたの質問に間違ったコードを入れています –

+0

応答ありがとう、Marcin。私はあなたが推奨する訂正をしました。私は間違いを犯しましたが、彼ら自身の問題を作り出していましたが、私のJSONで役に立たない応答の根本的な原因は依然として解決されていません。私はより広い解決策を発見しましたが、答えとして投稿します。 – user3125602

0

なぜこれが動作していません。これは実装コードやLaravelのエラーではなく、次のいずれかです。明らかに私がしなかった自明な結果を処理するために良いPHPコードを書いてください。 (ii)。実際に検証エラー応答を使用する方法については、Laravelの資料が不十分です。好きなのを選びな。

Laravelの検証では、Illuminate \ Validation \ ValidationErrorがスローされます。確かにそうであるかどうか、これは実際には "指定されたデータは無効でした"というエラーメッセージをデフォルトにします。したがって、\ Exceptionを捕まえてその$ e-> getMessage()を取り出すと、このデフォルトのエラーメッセージは、取得する。

あなたがする必要があるのは、\ Illuminate \ Validation \ ValidationErrorをキャプチャすることです。これは元々やっていたはずです。 - その方法を使用して、エラーメッセージをそこから抽出するのに役立ちます。ここで

は、私が作ってみたソリューションです:

<?php 
namespace App\Http\Controllers; 

use App\Location; 
use Illuminate\Http\Request; 


class LocationController extends Controller 
{ 

    /** 
    * Action method to add a location with the supplied Data 
    * 
    * @param \Illuminate\Http\Request $p_oRequest Request 
    * 
    * @return JSON 
    */ 
    public function add(Request $p_oRequest) 
    { 
     try { 

      $arrValid = array(
       'name' => 'required|alpha_num', 
       'user_id' => 'required|integer', 
      ); 
      $p_oRequest->validate(
       $arrValid, 
       array(
        'name.required' => 'Name is missing', 
        'name.alpha_num' => 'Name must be alphanumeric', 
        'user_id.required' => 'User Id is missing', 
        'user_id.integer' => 'User Id must be an integer', 
       ) 
      ); 

     } catch (\Illuminate\Validate\ValidationException $e) { 

      /** 
      * Validation failed 
      * Tell the end-user why 
      */ 
      $arrError = $e->errors(); // Useful method - thank you Laravel 
      /** 
      * Compile a string of error-messages 
      */ 
      foreach ($arrValid as $key=>$value) { 
       $arrImplode[] = implode(', ', $arrError[$key]); 
      } 
      $message = implode(', ', $arrImplode); 
      /** 
      * Populate the respose array for the JSON 
      */ 
      $arrResponse = array(
       'result' => 0, 
       'reason' => $message, 
       'data' => array(), 
       'statusCode' => $e->status, 
      ); 

     } catch (\Exception $ex) { 

      $arrResponse = array(
       'result' => 0, 
       'reason' => $ex->getMessage(), 
       'data' => array(), 
       'statusCode' => 404 
      ); 

     } finally { 

      return response()->json($arrResponse); 

     } 

    } 

} 

ので、確かに、Laravelは正しい応答を供給し、それは錫の側に言っでしたが、私は適用されませんでしたそれは正しく。それにもかかわらず、将来の私とLaravel-seaの他のPHPマリナーを失う助けとして、私は解決策を提供します。

さらに、私のバギーコーディングを指摘してくれたMarcinに感謝します。これは、上記のソリューションを実装していても問題を引き起こしていました。

関連する問題