如何在Laravel 5中捕获exception/缺失页面?
在Laravel 5中, App::missing
和App::error
不可用,那么现在如何捕获exception和缺less的页面呢?
在文档中找不到关于此的任何信息。
在Laravel 5中,您可以通过编辑app/Exceptions/Handler.php
的render
方法来捕获exception。
如果您想要捕获缺less的页面(也称为NotFoundException
),则需要检查exception$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
是否是Symfony\Component\HttpKernel\Exception\NotFoundHttpException
一个instanceof
,如果是,我们发送一个response
, 视图文件error.404
作为HTTP状态码404的内容 。
这可以用于任何exception。 因此,如果您的应用程序发送了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)开始,您只需在/ resources / views / errors /文件夹中添加一个404.blade.php文件,它将自动查找并显示它。
由于提交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模式可能会导致一堆缺less的页面(用户书签几页,并尝试重新加载)。 如果您不能覆盖服务器设置来处理这个问题,那么您可能会考虑重写缺less页面行为。
您可以修改\ 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 – 在视图 – >错误文件夹中创build错误视图
2 – 名称必须与404或403 500等HTTP错误相匹配
`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); }
将适合我的工作
如果你想保持你的networkingpath文件中的处理程序,在你现有的路线之后:
Route::any( '{all}', function ( $missingRoute) { // $missingRoute } )->where('all', '(.*)');
一种方法可以处理它,但不是最好的是转换到redirect。
<?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); } }