Общая ошибка 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);
}