開(kāi)始一個(gè) Laravel
項(xiàng)目的時(shí)候,錯(cuò)誤和異常處理已經(jīng)默認(rèn)為你配置好了。此外,Laravel
還集成了提供各種功能強(qiáng)大日志處理器的 Monolog
日志庫(kù)。
配置文件 config/app.php
中的 debug
配置選項(xiàng)控制瀏覽器顯示的錯(cuò)誤詳情數(shù)量。默認(rèn)情況下,該配置選項(xiàng)被設(shè)置在.env
文件中的環(huán)境變量 APP_DEBUG
。
對(duì)本地開(kāi)發(fā)而言,你應(yīng)該設(shè)置環(huán)境變量 APP_DEBUG
值為 true
。在生產(chǎn)環(huán)境,該值應(yīng)該被設(shè)置為 false
。
Laravel
支持日志方法 single
, daily
, syslog
和 errorlog
。例如,如果你想要日志文件按日生成而不是生成單個(gè)文件,應(yīng)該在配置文件 config/app.php
中設(shè)置 log
值如下:
'log' => 'daily'
如果你想要在應(yīng)用中完全控制 Monolog
的配置,可以使用應(yīng)用的 configureMonologUsing
方法。你應(yīng)該在 bootstrap/app.php
文件返回$app
變量之前調(diào)用該方法:
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
return $app;
所有異常都由類(lèi) App\Exceptions\Handler
處理,該類(lèi)包含兩個(gè)方法:report
和 render
。下面我們?cè)敿?xì)闡述這兩個(gè)方法。
report
方法用于記錄異常并將其發(fā)送給外部服務(wù)如 Bugsnag
。默認(rèn)情況下,report
方法只是將異常傳遞給異常被記錄的基類(lèi),你可以隨心所欲的記錄異常。
例如,如果你需要以不同方式報(bào)告不同類(lèi)型的異常,可使用 PHP
的 instanceof
比較操作符:
/**
* 報(bào)告或記錄異常
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e){
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
異常處理器的$dontReport
屬性包含一個(gè)不會(huì)被記錄的異常類(lèi)型數(shù)組,默認(rèn)情況下,404 錯(cuò)誤異常不會(huì)被寫(xiě)到日志文件,如果需要的話你可以添加其他異常類(lèi)型到這個(gè)數(shù)組。
render
方法負(fù)責(zé)將給定異常轉(zhuǎn)化為發(fā)送給瀏覽器的 HTTP
響應(yīng),默認(rèn)情況下,異常被傳遞給為你生成響應(yīng)的基類(lèi)。然而,你可以隨心所欲地檢查異常類(lèi)型或者返回自定義響應(yīng):
/**
* 將異常渲染到 HTTP 響應(yīng)中
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e){
if ($e instanceof CustomException) {
return response()->view('errors.custom', [], 500);
}
return parent::render($request, $e);
}
有些異常描述來(lái)自服務(wù)器的 HTTP
錯(cuò)誤碼,例如,這可能是一個(gè)“頁(yè)面未找到”錯(cuò)誤(404),“認(rèn)證失敗錯(cuò)誤”(401)亦或是程序出錯(cuò)造成的 500 錯(cuò)誤,為了在應(yīng)用中生成這樣的響應(yīng),使用如下方法:
abort(404);
abort
方法會(huì)立即引發(fā)一個(gè)會(huì)被異常處理器渲染的異常,此外,你還可以像這樣提供響應(yīng)描述:
abort(403, 'Unauthorized action.');
該方法可在請(qǐng)求生命周期的任何時(shí)間點(diǎn)使用。
Laravel 使得返回多種 HTTP
狀態(tài)碼的錯(cuò)誤頁(yè)面變得簡(jiǎn)單,例如,如果你想要自定義 404 錯(cuò)誤頁(yè)面,創(chuàng)建一個(gè) resources/views/errors/404.blade.php
文件,給文件將會(huì)渲染程序生成的所有 404 錯(cuò)誤。
改目錄下的視圖命名應(yīng)該和相應(yīng)的 HTTP 狀態(tài)碼相匹配。
Laravel
日志工具基于強(qiáng)大的 Monolog
庫(kù),默認(rèn)情況下,Laravel 被配置為在 storage/logs
目錄下每日為應(yīng)用生成日志文件,你可以使用 Log
門(mén)面編寫(xiě)日志信息到日志中:
<?php
namespace App\Http\Controllers;
use Log;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 顯示指定用戶(hù)的屬性
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
該日志記錄器提供了 RFC 5424中定義的八種日志級(jí)別:emergency, alert, critical, error,warning, notice, info 和 debug。
Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);
上下文數(shù)據(jù)數(shù)組也會(huì)被傳遞給日志方法。上下文數(shù)據(jù)將會(huì)和日志消息一起被格式化和顯示:
Log::info('User failed to login.', ['id' => $user->id]);
Monolog 有多個(gè)可用于日志的處理器,如果需要的話,你可以訪問(wèn)底層 Monolog 實(shí)例:
$monolog = Log::getMonolog();