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

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

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

8 ответов


в 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 of Symfony\Component\HttpKernel\Exception\NotFoundHttpException и если мы посылаем response С посмотреть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);
}

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


С момента совершения 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 все еще находится в тяжелом развитии, и изменения могут произойти снова.


угловой режим 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);
}

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

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

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

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

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

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

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

и

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

будет работать должным образом для меня


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

<?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);
        }

}