Как ловить исключения / пропущенные страницы в Laravel 5?

53

В Laravel 5, App::missing и App::error недоступны, так как ваши исключения catch и отсутствующие страницы сейчас?

Я не мог найти никакой информации об этом в документации.

Теги:
laravel-5

8 ответов

90
Лучший ответ

В Laravel 5 вы можете перехватывать исключения, редактируя метод render в app/Exceptions/Handler.php.

Если вы хотите поймать недостающую страницу (также известную как NotFoundException), вам нужно проверить, является ли исключение, $e, экземпляром Symfony\Component\HttpKernel\Exception\NotFoundHttpException.

public function render($request, Exception $e) {
    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

    return parent::render($request, $e);
}

С приведенным выше кодом мы проверяем, является ли $e instanceof Symfony\Component\HttpKernel\Exception\NotFoundHttpException, и если мы отправим response с view file error.404 как контент с код статуса HTTP 404.

Это может быть использовано для любого исключения. Поэтому, если ваше приложение отправляет исключение из App\Exceptions\MyOwnException, вместо этого вы проверяете этот экземпляр.

public function render($request, Exception $e) {
    if ($e instanceof \App\Exceptions\MyOwnException)
        return ''; // Do something if this exception is thrown here.

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
        return response(view('error.404'), 404);

    return parent::render($request, $e);
}
  • 4
    Как вы узнали этот ответ, где я могу найти больше информации об этом?
  • 0
    @adityamenon, это было для предыдущей версии разработки Laravel 5. Я переписал его, чтобы соответствовать текущей версии Laravel 5.
Показать ещё 3 комментария
15

С фиксацией с сегодняшнего дня (9db97c3) все, что вам нужно сделать, это добавить файл 404.blade.php в папку /resources/views/errors/, и он найдет и отобразит его автоматически.

  • 1
    Нет, это не работает для меня
  • 1
    Работал на меня ...
Показать ещё 1 комментарий
4

Так как совершает 30681dc и 9acf685 метод missing() был перенесен в класс Illuminate\Exception\Handler.

Итак, в течение некоторого времени вы могли бы сделать это:

app('exception')->missing(function($exception)
{
    return Response::view('errors.missing', [], 404);
});


... Но в последнее время рефакторинг был выполнен в 62ae860.

Теперь вы можете добавить следующее к app/Http/Kernel.php:

// add this...
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Response;

class Kernel extends HttpKernel {

    (...)

    public function handle($request)
    {
        try
        {
            return parent::handle($request);
        }

        // ... and this:
        catch (NotFoundHttpException $e)
        {
            return Response::view('errors.missing', [], 404);
        }

        catch (Exception $e)
        {
            throw $e;
        }
    }


Наконец, пожалуйста, имейте в виду, что Laravel все еще находится в тяжелом развитии, и изменения могут произойти снова.

  • 0
    Я надеюсь, что больше не изменится в ближайшее время!
2

Angular Режим HTML5 может привести к сбою недостающих страниц (пользовательская закладка несколько страниц и попробуйте перезагрузить). Если вы не можете переопределить настройки сервера, чтобы справиться с этим, вы можете подумать о том, чтобы игнорировать поведение пропущенных страниц.

Вы можете изменить метод рендеринга \App\Exceptions\Handler, чтобы нажимать контент с 200, а не нажимать 404-шаблон с кодом 404.

/**
 * 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 ($this->isHttpException($e) && $e->getStatusCode() == 404)
    {
        return response()->view('angular', []);
    }
    return parent::render($request, $e);
}
  • 0
    Делал то же самое, но забыл про $this->isHttpException($e) . Спасибо
0

Если вы хотите сохранить обработчик в своем файле веб-маршрутов после существующих маршрутов:

Route::any( '{all}', function ( $missingRoute) {
    // $missingRoute
} )->where('all', '(.*)');
0

Добавив следующий код

protected $dontReport = [
            'Symfony\Component\HttpKernel\Exception\HttpException'
    ];

и

public function render($request, Exception $e)
    {
    return redirect('/');
            //return parent::render($request, $e);
    }

будет работать правильно для меня

0

Laravel отправляется со страницей ошибок по умолчанию, вы можете легко добавить страницы с ошибками, например,

1 - Создайте представление ошибки в представлении → папка ошибок
2 - Имя должно соответствовать ошибкам HTTP, например 404 или 403 500

`Route::get('/page/not/found',function($closure){
  // second param is  optional 
  abort(404, 'Page Not found');
});`
-2

Один из способов, которым вы можете справиться с этим, но не лучшим образом - перейти на перенаправление.

<?php namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler {

        /**
         * A list of the exception types that should not be reported.
         *
         * @var array
         */
        protected $dontReport = [
                'Symfony\Component\HttpKernel\Exception\HttpException'
        ];

        /**
         * Report or log an exception.
         *
         * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
         *
         * @param  \Exception  $e
         * @return void
         */
        public function report(Exception $e)
        {
                return parent::report($e);
        }

        /**
         * 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)
        {
        return redirect('/');
                //return parent::render($request, $e);
        }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню