Как я могу поймать исключения / отсутствующие страницы в 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
наSymfony\Component\HttpKernel\Exception\NotFoundHttpException
и если мы посылаемresponse
С view fileerror.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 the
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, а не шаблона push 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); } }