В Laravel 5, App::missing
и App::error
недоступны, так как ваши исключения catch и отсутствующие страницы сейчас?
Я не мог найти никакой информации об этом в документации.
В Laravel 5, App::missing
и App::error
недоступны, так как ваши исключения catch и отсутствующие страницы сейчас?
Я не мог найти никакой информации об этом в документации.
В 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);
}
С фиксацией с сегодняшнего дня (9db97c3) все, что вам нужно сделать, это добавить файл 404.blade.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 все еще находится в тяжелом развитии, и изменения могут произойти снова.
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);
}
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);
}
будет работать правильно для меня
Если вы хотите сохранить обработчик в своем файле веб-маршрутов после существующих маршрутов:
Route::any( '{all}', function ( $missingRoute) {
// $missingRoute
} )->where('all', '(.*)');
Один из способов, которым вы можете справиться с этим, но не лучшим образом - перейти на перенаправление.
<?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);
}
}