¿Cómo capturo excepciones / páginas faltantes en Laravel 5?

En Laravel 5, App::missing y App::error no está disponible, entonces, ¿cómo pueden las excepciones de captura y las páginas que faltan ahora?

No pude encontrar ninguna información con respecto a esto en la documentación.

En Laravel 5 puede capturar excepciones editando el método de render en la app/Exceptions/Handler.php .

Si desea capturar una página faltante (también conocida como NotFoundException ), debería verificar si la excepción, $e , es una instancia de 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); } 

Con el código anterior, verificamos si $e es una instanceof de Symfony\Component\HttpKernel\Exception\NotFoundHttpException y si es así, enviamos una response con el archivo de vista error.404 como contenido con el código de estado HTTP 404 .

Esto se puede usar para CUALQUIER excepción. Por lo tanto, si su aplicación envía una excepción de App\Exceptions\MyOwnException , en su App\Exceptions\MyOwnException , App\Exceptions\MyOwnException esa instancia.

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

Con commit desde hoy (9db97c3), todo lo que necesita hacer es agregar un archivo 404.blade.php en la carpeta / resources / views / errors / y lo encontrará y mostrará automáticamente.

Como confirma 30681dc y 9acf685, el método missing() se movió a la clase Illuminate\Exception\Handler .

Entonces, por algún tiempo, podrías hacer esto:

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

… Pero recientemente, se realizó una refactorización en 62ae860 .

Ahora, lo que puedes hacer es agregar lo siguiente a la 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; } } 

Finalmente, tenga en cuenta que Laravel aún está en desarrollo y que los cambios pueden volver a ocurrir.

El modo HTML5 angular podría causar un montón de páginas faltantes (algunas páginas de marcador de usuario e intentan volver a cargar). Si no puede anular la configuración del servidor para manejar eso, puede pensar en anular el comportamiento de la página faltante.

Puede modificar el método de representación de \ App \ Exceptions \ Handler para insertar contenido con 200 en lugar de presionar la plantilla 404 con código 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); } 

En caso de que quiera mantener el controlador en su archivo de rutas web, después de las rutas existentes:

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

Laravel se envía con la página de error predeterminada. Puede agregar fácilmente páginas de error personalizadas como esta

1 – Crear una vista de error en la vista -> carpeta de errores
2 – El nombre debe coincidir con errores HTTP como 404 o 403 500

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

Al agregar el siguiente código

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

y

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

me funcionará bien

Una forma de manejarlo pero no es la mejor es cambiar a una redirección.

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