Как поймать исключения / отсутствующие страницы в 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);
}
}