2017-09-16 59 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,「原因「:」Name must be alphanumeric「,」data「:[],」statusCode「:404}

我得到的實際響應是:{」result「:0,」reason「:」給定的數據是無效「,」data「:[],」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中的錯誤問題,而是以下兩者之一:(i)。編寫好的PHP代碼來處理不言自明的結果,這顯然我沒有做到; (ⅱ)。 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指出我的錯誤編碼,即使我已經實現了上述解決方案,這也會導致問題。