2014-04-18 130 views
13

我目前正在嘗試如何使用Laravel構建RESTful API,並且我目前正在創建新用戶。這只是一個測試,我在使用Laravel中的驗證嘗試驗證請求時得到了一些結果;這裏是結果:Laravel中的REST API驗證請求時

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格式獲得驗證?

回答

17

您應該返回錯誤(這是Illuminate\Support\MessageBag的一個實例)並對其進行編碼。 A MessageBag實例允許您將其直接轉換爲其JSON表示。

$errors = $validation->errors(); 

return $errors->toJson(); 

現在不嘟我自己的號角,但我最近開發了Laravel一個RESTful API包,它確實這一切爲你和所有你需要做的是拋出一個簡單的異常。請參閱我的dingo/api包和維基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."] 
    } 
} 
+0

生病試試你的包後,我做這項工作。問題是它將if($ validation-> failed()){}返回到我的終端的html中,所以你最終會返回一些html,然後它不會讀取下面的代碼行。那我的理論究竟發生了什麼呢.. – Aoi

+0

來自它。我必須指定內容類型。我在這裏找到答案http://stackoverflow.com/questions/7172784/how-to-post-json-data-with-curl-from-terminal-commandline-to-test-spring-rest – Aoi

+0

你應該聽到你的號角。 Dingo現在是非常受歡迎的套餐。所以,感謝您的支持! –

3

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響應。

11

這些代碼將幫助你,爲我工作。

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

這個回答值得信賴。我試過所有的解決方案,並且這個在Laravel 5.2中給了我正確的信息。 –

+1

謝謝@GlennPlas – bhupendraosd