一般在web開發中,我們很少會接觸到除了404頁面其它的http通信錯誤頁面,即使是做404頁面,我們也只是單純的修改框架自帶了404模板,很少能夠做到完全的控制。但Laravel5改變了這種現狀,那么,我們去看看如何使用Laravel5自定義錯誤頁面的。
Laravel5是如何處理異常的
Laravel5將所有的自定義錯誤和異常處理都移到了App/Exceptions/Hander.php。早期Laravel的報錯頁面會顯示'Whoops...',然后顯示出錯誤信息,laravel后期還專門弄了個花哨的錯誤異常頁面,可能是覺得異常頁面多數在項目上線之后會被關閉或者自定義錯誤頁面,所以就回到了最初的美好---'Whoops...'.
在hander里面調用的方法如下:
/** * 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)) { return $this->renderHttpException($e); } else { return (new SymfonyDisplayer(config('app.debug')))->createResponse($e); } }
所有的HTTP異常(如404和503),它們都是使用renderHttpException方法,它在\Illuminate\Foundation\Exceptions\Handler下可以找見。
/** * Render the given HttpException. * * @param \Symfony\Component\HttpKernel\Exception\HttpException $e * @return \Symfony\Component\HttpFoundation\Response */ protected function renderHttpException(HttpException $e) { if (view()->exists('errors.'.$e->getStatusCode())) { return response()->view('errors.'.$e->getStatusCode(), [], $e->getStatusCode()); } else { return (new SymfonyDisplayer(config('app.debug')))->createResponse($e); } }
我們看到view方法下定義了視圖存在的位置,{'errors'.$e->getStatusCode()}
,OK,現在就明白了,Http錯誤頁面就是對應在views/errors/[code].blade.php文件,比如:404.blade.php,503.blade.php等等。若是對應的code錯誤頁面不存在,會使用默認的Whoop拋出異常。
我在laravel4中是如何處理異常的
異常捕捉是在路由文件中進行的:
// error App::error(function (Exception $exception) { Log::error($exception); $error = $exception->getMessage(); if(Request::ajax()){ return Response::json(['status'=>false, 'error'=>$error]); }else{ return Redirect::back()->withErrors(compact('error')); } });
自定義404錯誤頁面也是在理由文件中進行的:
// 404 page not found App::missing(function () { return Response::view('errors.404', array(), 404); });
相比laravel4,laravel5將http處理獨立出來無疑不體現系統架構的合理化。
在之前我們看到Laravel5的異常處理app/exceptions/Hander.php:
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 parent::render($request, $e); } }
第一個方法提交日志,你可以把它提交到你們專門的日志服務器,比如我們公司有自己的鷹眼日志系統;第二個方法執行異常,你也可以在這里使用$e->getStatusCode()
獲取到http錯誤代碼,根據不同的錯誤代碼進行操作,也可以在此自定義錯誤模板。
其實,如果大家仔細發現。我在laravel4中對異常處理也是三個方面:日志記錄、異常代碼處理和自定義錯誤頁面。Laravel5將一系列操作獨立出來,那么在異常處理這一塊肯定是非常好的提升了。
本文轉自小白巷,更多文章,請查看 http://www.xbhub.com