Laravel 5: リクエストにJSONが必要な場合の例外の処理 質問する

Laravel 5: リクエストにJSONが必要な場合の例外の処理 質問する

私は Laravel 5 で AJAX 経由でファイルのアップロードを行っています。1 つを除いて、ほぼすべてが機能しています。

大きすぎるファイル (より大きい) をアップロードしようとするとupload_max_filesizepost_max_sizeTokenMismatchException がスローされます。

ただし、これらの制限を超えると入力が空になることがわかっているので、これは予想どおりです。入力が空ということは、何も_token受信されないことを意味します。そのため、CSRF トークンの検証を担当するミドルウェアが大騒ぎしているのです。

ただし、私の問題は、この例外がスローされることではなく、それがどのようにレンダリングされるかです。この例外が Laravel によってキャッチされると、汎用 Whoops ページの HTML が出力されます (デバッグ モードなので、スタック トレースが大量に実行されます)。

それ以外の場合はデフォルトの動作を維持しながら、JSON が AJAX 経由で返されるように (または JSON が要求されたときに) この例外を処理する最適な方法は何ですか?


編集:これは、スローされた例外に関係なく発生するようです。404 を取得しようとして、存在しない「ページ」に AJAX (データ型: JSON) 経由でリクエストを送信しようとしたところ、同じことが起こりました。HTML が返され、JSON に適したものはありませんでした。

ベストアンサー1

@Wader の回答と @Tyler Crompton のコメントを考慮して、自分でもこの質問に挑戦してみたいと思います。

app/例外/ハンドラ.php

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)
{
    // If the request wants JSON (AJAX doesn't always want JSON)
    if ($request->wantsJson()) {
        // Define the response
        $response = [
            'errors' => 'Sorry, something went wrong.'
        ];

        // If the app is in debug mode
        if (config('app.debug')) {
            // Add the exception class name, message and stack trace to response
            $response['exception'] = get_class($e); // Reflection might be better here
            $response['message'] = $e->getMessage();
            $response['trace'] = $e->getTrace();
        }

        // Default response of 400
        $status = 400;

        // If this exception is an instance of HttpException
        if ($this->isHttpException($e)) {
            // Grab the HTTP status code from the Exception
            $status = $e->getStatusCode();
        }

        // Return a JSON response with the response array and status code
        return response()->json($response, $status);
    }

    // Default to the parent class' implementation of handler
    return parent::render($request, $e);
}

おすすめ記事