Общая ошибка Laravel 5 как json
Я просто перейду на laravel 5 и im получаю ошибки от laravel на странице HTML. Что-то вроде этого:
Sorry, the page you are looking for could not be found.
1/1
NotFoundHttpException in Application.php line 756:
Persona no existe
in Application.php line 756
at Application->abort('404', 'Person doesnt exists', array()) in helpers.php line
Когда я работаю с laravel 4, все работает нормально, ошибки в формате json, таким образом я могу разобрать сообщение об ошибке и показать сообщение пользователю. Пример ошибки json:
{"error":{
"type":"Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException",
"message":"Person doesnt exist",
"file":"C:\\xampp\\htdocs\\backend1\\bootstrap\\compiled.php",
"line":768}}
Как я могу достичь этого в laravel 5.
Извините за мой плохой английский, спасибо большое.
Ответы
Ответ 1
Я пришел сюда раньше, чтобы узнать, как выбросить исключения json в любом месте в Laravel, и ответ поставил меня на правильный путь. Для тех, кто находит это для поиска аналогичного решения, вот как я реализовал приложение:
Добавьте этот код в метод render
app/Exceptions/Handler.php
if ($request->ajax() || $request->wantsJson()) {
return new JsonResponse($e->getMessage(), 422);
}
Добавьте это в метод обработки объектов:
if ($request->ajax() || $request->wantsJson()) {
$message = $e->getMessage();
if (is_object($message)) { $message = $message->toArray(); }
return new JsonResponse($message, 422);
}
И затем используйте этот общий бит кода в любом месте:
throw new \Exception("Custom error message", 422);
И он преобразует все ошибки, возникшие после запроса ajax к исключениям Json, готовым к использованию любым способом: -)
Ответ 2
Laravel 5.1
Чтобы сохранить код состояния HTTP на неожиданных исключениях, например 404, 500 403...
Это то, что я использую (app/Exceptions/Handler.php):
public function render($request, Exception $e)
{
$error = $this->convertExceptionToResponse($e);
$response = [];
if($error->getStatusCode() == 500) {
$response['error'] = $e->getMessage();
if(Config::get('app.debug')) {
$response['trace'] = $e->getTraceAsString();
$response['code'] = $e->getCode();
}
}
return response()->json($response, $error->getStatusCode());
}
Ответ 3
Laravel 5 предлагает обработчик исключений в app/Exceptions/Handler.php
. Метод render
может использоваться для визуализации определенных исключений по-разному, то есть
public function render($request, Exception $e)
{
if ($e instanceof API\APIError)
return \Response::json(['code' => '...', 'msg' => '...']);
return parent::render($request, $e);
}
Лично я использую App\Exceptions\API\APIError
как общее исключение, когда я хочу вернуть ошибку API. Вместо этого вы можете просто проверить, является ли запрос AJAX (if ($request->ajax())
), но я думаю, что явное определение исключения API кажется более чистым, потому что вы можете расширить класс APIError
и добавить любые функции, которые вам нужны.
Ответ 4
Изменение: Laravel 5.6 очень хорошо справляется с этим без каких-либо изменений, просто убедитесь, что вы отправляете заголовок Accept
как application/json
.
Если вы хотите сохранить код состояния (полезно, чтобы интерфейсная сторона понимала тип ошибки), я предлагаю использовать это в вашем приложении /Exceptions/Handler.php:
public function render($request, Exception $exception)
{
if ($request->ajax() || $request->wantsJson()) {
// this part is from render function in Illuminate\Foundation\Exceptions\Handler.php
// works well for json
$exception = $this->prepareException($exception);
if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) {
return $exception->getResponse();
} elseif ($exception instanceof \Illuminate\Auth\AuthenticationException) {
return $this->unauthenticated($request, $exception);
} elseif ($exception instanceof \Illuminate\Validation\ValidationException) {
return $this->convertValidationExceptionToResponse($exception, $request);
}
// we prepare custom response for other situation such as modelnotfound
$response = [];
$response['error'] = $exception->getMessage();
if(config('app.debug')) {
$response['trace'] = $exception->getTrace();
$response['code'] = $exception->getCode();
}
// we look for assigned status code if there isn't we assign 500
$statusCode = method_exists($exception, 'getStatusCode')
? $exception->getStatusCode()
: 500;
return response()->json($response, $statusCode);
}
return parent::render($request, $exception);
}
Ответ 5
В Laravel 5.5 вы можете использовать метод prepareJsonResponse
в app/Exceptions/Handler.php
, который будет принудительно отвечать как JSON.
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return $this->prepareJsonResponse($request, $exception);
}
Ответ 6
Вместо
if ($request->ajax() || $request->wantsJson()) {...}
использование
if ($request->expectsJson()) {...}
поставщика\Laravel\рамка\SRC\Осветите\Http\концернов\InteractsWithContentTypes.php: 42
public function expectsJson()
{
return ($this->ajax() && ! $this->pjax()) || $this->wantsJson();
}
Ответ 7
Я обновил my app/Exceptions/Handler.php
, чтобы уловить HTTP-исключения, которые не были ошибками проверки:
public function render($request, Exception $exception)
{
// converts errors to JSON when required and when not a validation error
if ($request->expectsJson() && method_exists($exception, 'getStatusCode')) {
$message = $exception->getMessage();
if (is_object($message)) {
$message = $message->toArray();
}
return response()->json([
'errors' => array_wrap($message)
], $exception->getStatusCode());
}
return parent::render($request, $exception);
}
Проверяя метод getStatusCode()
, вы можете определить, может ли исключение успешно применяться к JSON.
Ответ 8
Если вы хотите получить ошибки исключения в формате json, то
откройте класс Handler в App\Exceptions\Handler и настройте его.
Вот пример для несанкционированных запросов и не найденных ответов
public function render($request, Exception $exception)
{
if ($exception instanceof AuthorizationException) {
return response()->json(['error' => $exception->getMessage()], 403);
}
if ($exception instanceof ModelNotFoundException) {
return response()->json(['error' => $exception->getMessage()], 404);
}
return parent::render($request, $exception);
}