Laravel=とLumenは初めてです。常に出力としてJSONオブジェクトのみを取得していることを確認したいのですが、Lumenでこれを行うにはどうすればよいですか?
response()->json($response);
を使用してJSON応答を取得できます。しかし、エラーが発生すると、APIからtext/html
エラー。しかし、私はapplication/json
反応。
前もって感謝します。
例外ハンドラーを調整する必要があります(app/Exceptions/Handler.php
)必要な応答を返します。
これは、実行できることの非常に基本的な例です。
public function render($request, Exception $e)
{
$rendered = parent::render($request, $e);
return response()->json([
'error' => [
'code' => $rendered->getStatusCode(),
'message' => $e->getMessage(),
]
], $rendered->getStatusCode());
}
@Waderの回答に基づくより正確なソリューションは次のとおりです。
use Illuminate\Http\JsonResponse;
public function render($request, Exception $e)
{
$parentRender = parent::render($request, $e);
// if parent returns a JsonResponse
// for example in case of a ValidationException
if ($parentRender instanceof JsonResponse)
{
return $parentRender;
}
return new JsonResponse([
'message' => $e instanceof HttpException
? $e->getMessage()
: 'Server Error',
], $parentRender->status());
}
APIを使用している場合は、これを行っています
<?php namespace App\Exceptions;
use Exception;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Laravel\Lumen\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Http\Response;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
];
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param Exception $e
*
* @throws Exception
*/
public function report(Exception $e): void
{
parent::report($e);
}
/**
* @param \Illuminate\Http\Request $request
* @param Exception $e
*
* @return \Illuminate\Http\JsonResponse|Response
*/
public function render($request, Exception $e)
{
if (env('APP_DEBUG')) {
return parent::render($request, $e);
}
$status = Response::HTTP_INTERNAL_SERVER_ERROR;
if ($e instanceof HttpResponseException) {
$status = Response::HTTP_INTERNAL_SERVER_ERROR;
} elseif ($e instanceof MethodNotAllowedHttpException) {
$status = Response::HTTP_METHOD_NOT_ALLOWED;
$e = new MethodNotAllowedHttpException([], 'HTTP_METHOD_NOT_ALLOWED', $e);
} elseif ($e instanceof NotFoundHttpException) {
$status = Response::HTTP_NOT_FOUND;
$e = new NotFoundHttpException('HTTP_NOT_FOUND', $e);
} elseif ($e instanceof AuthorizationException) {
$status = Response::HTTP_FORBIDDEN;
$e = new AuthorizationException('HTTP_FORBIDDEN', $status);
} elseif ($e instanceof \Dotenv\Exception\ValidationException && $e->getResponse()) {
$status = Response::HTTP_BAD_REQUEST;
$e = new \Dotenv\Exception\ValidationException('HTTP_BAD_REQUEST', $status, $e);
} elseif ($e) {
$e = new HttpException($status, 'HTTP_INTERNAL_SERVER_ERROR');
}
return response()->json([
'status' => $status,
'message' => $e->getMessage()
], $status);
}
}
[〜#〜] mtvs [〜#〜] 回答として、JsonResponseクラスを使用して応答をフォーマットし、renderメソッド内から静的メンバーとして使用することもできます。この:
public function render($request, Exception $e)
{
$parentRender = parent::render($request, $e);
// if parent returns a JsonResponse
// for example in case of a ValidationException
if ($parentRender instanceof \Illuminate\Http\JsonResponse)
{
return $parentRender;
}
return new \Illuminate\Http\JsonResponse([
'message' => $e instanceof HttpException
? $e->getMessage()
: 'Server Error',
], $parentRender->status());
}