2015-05-29 32 views
6

Tôi có yêu cầu biểu mẫu để xác thực dữ liệu đăng ký. Ứng dụng này là một API dành cho thiết bị di động và tôi muốn lớp này trả về JSON được định dạng trong trường hợp xác thực không thành công thay vì những gì nó làm theo mặc định (chuyển hướng).Laravel 5 yêu cầu thay đổi biểu mẫu yêu cầu xác thực không thành công

Tôi đã cố gắng ghi đè phương thức failedValidation từ lớp Illuminate\Foundation\Http\FormRequest. nhưng điều đó dường như không hoạt động. Bất kỳ ý tưởng?

Code:

<?php 

namespace App\Http\Requests; 

use App\Http\Requests\Request; 
use Illuminate\Contracts\Validation\Validator; 

class RegisterFormRequest extends Request { 

/** 
* Determine if the user is authorized to make this request. 
* 
* @return bool 
*/ 
public function authorize() { 
    return TRUE; 
} 

/** 
* Get the validation rules that apply to the request. 
* 
* @return array 
*/ 
public function rules() { 
    return [ 
     'email' => 'email|required|unique:users', 
     'password' => 'required|min:6', 
    ]; 
} 

} 
+2

Xin vui lòng gửi mã của bạn để mọi người kiểm tra. – SuperBiasedMan

+0

Tôi đoán bạn đang gọi API của mình qua AJAX? Bạn có thể buộc cuộc gọi API mong đợi JSON từ API của bạn không? Trong jQuery nó trông giống như sau: $ .getJSON. – ChainList

Trả lời

1

Bằng cách nhìn vào chức năng sau đây trong Illuminate\Foundation\Http\FormRequest, có vẻ như Laravel xử lý nó đúng cách.

/** 
    * Get the proper failed validation response for the request. 
    * 
    * @param array $errors 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function response(array $errors) 
    { 
     if ($this->ajax() || $this->wantsJson()) 
     { 
      return new JsonResponse($errors, 422); 
     } 

     return $this->redirector->to($this->getRedirectUrl()) 
             ->withInput($this->except($this->dontFlash)) 
             ->withErrors($errors, $this->errorBag); 
    } 

Và theo wantsJson chức năng trong Illuminate\Http\Request dưới đây, bạn phải tìm một cách rõ ràng JSON Đáp lại,

/** 
    * Determine if the current request is asking for JSON in return. 
    * 
    * @return bool 
    */ 
    public function wantsJson() 
    { 
     $acceptable = $this->getAcceptableContentTypes(); 

     return isset($acceptable[0]) && $acceptable[0] == 'application/json'; 
    } 
0

Đây là giải pháp của tôi và nó đang làm việc tốt trong kết thúc của tôi. Tôi đã thêm chức năng bên dưới Mã yêu cầu:

public function response(array $errors) 
{ 
    if ($this->ajax() || $this->wantsJson()) 
    { 
     return Response::json($errors); 
    } 

    return $this->redirector->to($this->getRedirectUrl()) 
            ->withInput($this->except($this->dontFlash)) 
            ->withErrors($errors, $this->errorBag); 
} 

Chức năng phản hồi xử lý tốt bởi laravel. Nó sẽ tự động trở lại nếu bạn yêu cầu json hoặc ajax.

4

Không cần ghi đè bất kỳ chức năng nào. chỉ cần bạn thêm

Accept: application/json 

Trong tiêu đề biểu mẫu của bạn. Laravel sẽ trả về phản hồi trong cùng một URL và ở định dạng JSON.

0

Chỉ cần thêm các chức năng sau đây theo yêu cầu của bạn:

use Response; 
public function response(array $errors) 
{ 
     return Response::json($errors);  
} 
Các vấn đề liên quan