2016-02-11 9 views
10

私はLaravel 5でREST APIを構築しています。LaravelコントローラからAJAXエラーを返すには?

Laravel 5では、特定のルートを処理する前に満たさなければならない検証ルールを定義するためにサブタイプApp\Http\Requests\Requestをサブクラス化できます。例えば:

<?php 

namespace App\Http\Requests; 

use App\Http\Requests\Request; 

class BookStoreRequest extends Request { 

    public function authorize() { 
     return true; 
    } 

    public function rules() { 
     return [ 
      'title' => 'required', 
      'author_id' => 'required' 
     ]; 
    } 
} 

クライアントは、AJAXリクエストを介して、対応するルートをロードし、そしてBookStoreRequest要求がルールを満たさない場合、それは自動的にJSONオブジェクトとしてエラー(複数可)を返すことを発見した場合。たとえば、次の要求が既に受け付け、コントローラに渡された後

{ 
    "title": [ 
    "The title field is required." 
    ] 
} 

しかし、Request::rules()方法のみ検証することができ、入力および入力が有効な場合でも、エラーの他の種類が発生する可能性があります。たとえば、のは、コントローラは、いくつかのファイルに新しい書籍情報を書き込む必要があるとしましょう理由-が、ファイルを開くことができません。

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 

use App\Http\Requests\BookCreateRequest; 

class BookController extends Controller { 

    public function store(BookStoreRequest $request) { 

     $file = fopen('/path/to/some/file.txt', 'a'); 

     // test to make sure we got a good file handle 
     if (false === $file) { 
      // HOW CAN I RETURN AN ERROR FROM HERE? 
     } 

     fwrite($file, 'book info goes here'); 
     fclose($file); 

     // inform the browser of success 
     return response()->json(true); 

    } 

} 

もちろん、私はちょうどdie()できたが、それは超醜いです。検証エラーと同じ形式でエラーメッセージを返すことをお勧めします。このように:

独自のJSONオブジェクトを作成して返すことができますが、確かにLaravelはこれをネイティブにサポートしています。

これを行うにはどのような方法が最適ですか?または、Laravel REST APIのランタイム(検証時ではなく)エラーを返すためのより良い方法がありますか?

+0

あなたは 'return response() - > json(['error' => 'あなたのカスタムメッセージ'])を実行できません。 –

+0

カスタムjsonレスポンスクラス – Digitlimit

+0

をビルドすることができます。 'return response() - > json()'は200 OKを返します。適切な200以外の応答コード(例:500 Internal Server Error)を使用したいええ、私も手書きで書くことができました - 私はLaravelがこれを行うための組み込みの、より構造化された方法をすでに提供していると仮定しました。たぶんそれは間違った前提です。 – greenie2600

答えて

13

あなたは以下のようにあなたのJSONレスポンスのステータスコードを設定することができます。

return Response::json(['error' => 'Error msg'], 404); // Status code here 

それともヘルパー関数を使用しては:

return response()->json(['error' => 'Error msg'], 404); // Status code here 
+0

は、$ response()関数ではなくresponse()関数を使用します。 –

3

あなたは多くの方法でそれを行うことができます。

まず、あなたはステータスコードを提供することにより、簡単なresponse()->json()を使用することができます。

return response()->json(/** response **/, 401); 

または、すべての誤りがJSONレスポンスであることを保証するために、よりCOMPLEXE方法で、あなたが例外ハンドラを設定することができます特別な例外をキャッチし、jsonを返します。

オープンApp\Exceptions\Handlerと次の操作を行います

class Handler extends ExceptionHandler 
{ 
    /** 
    * A list of the exception types that should not be reported. 
    * 
    * @var array 
    */ 
    protected $dontReport = [ 
     HttpException::class, 
     HttpResponseException::class, 
     ModelNotFoundException::class, 
     NotFoundHttpException::class, 
     // Don't report MyCustomException, it's only for returning son errors. 
     MyCustomException::class 
    ]; 

    public function render($request, Exception $e) 
    { 
     // This is a generic response. You can the check the logs for the exceptions 
     $code = 500; 
     $data = [ 
      "error" => "We couldn't hadle this request. Please contact support." 
     ]; 

     if($e instanceof MyCustomException) { 
      $code = $e->getStatusCode(); 
      $data = $e->getData(); 
     } 

     return response()->json($data, $code); 
    } 
} 

これは、アプリケーションでスローされた例外のためにJSONを返します。 今、私たちはアプリ/例外では例えば、MyCustomExceptionを作成します。私たちは今、ちょうどMyCustomExceptionまたはJSONエラーを返すようにMyCustomExceptionを拡張する任意の例外を使用することができます

class MyCustomException extends Exception { 

    protected $data; 
    protected $code; 

    public static function error($data, $code = 500) 
    { 
     $e = new self; 
     $e->setData($data); 
     $e->setStatusCode($code); 

     throw $e; 
    } 

    public function setStatusCode($code) 
    { 
     $this->code = $code; 
    } 

    public function setData($data) 
    { 
     $this->data = $data; 
    } 


    public function getStatusCode() 
    { 
     return $this->code; 
    } 

    public function getData() 
    { 
     return $this->data; 
    } 
} 

public function store(BookStoreRequest $request) { 

    $file = fopen('/path/to/some/file.txt', 'a'); 

    // test to make sure we got a good file handle 
    if (false === $file) { 
     MyCustomException::error(['error' => 'could not open the file, check permissions.'], 403); 

    } 

    fwrite($file, 'book info goes here'); 
    fclose($file); 

    // inform the browser of success 
    return response()->json(true); 

} 

さて、MyCustomException経由スローだけでなく、例外はJSONエラーを返しますが、一般的にスローされたその他の例外になります。

関連する問題