Laravel 4.2 雖屬舊版本,但其架構思想在現代 Laravel (5.x/8.x/10.x) 中延續至今。本文分享實戰項目中關於異常處理、分類日誌、任務隊列、過濾器驗證、多環境配置的標準化設計模式,具備極高參考價值。
// app/lib/exception/HttpException.php
class HttpRequestException extends Exception {}
class HttpResponseException extends Exception {}
按業務模塊劃分目錄,簡單異常可合併在單文件。
// app/start/global.php
function handleException($code, $exception) {
return Decorate::failed($code, null, $exception->getFile() . ':' . $exception->getLine() . ',' . $exception->getMessage());
}
App::error(function(HttpRequestException $exception, $code) {
return handleException(-1007, $exception);
});
App::error(function(HttpResponseException $exception, $code) {
return handleException(-1008, $exception);
});
RequestLog::request($url, $data, $start, $content);
if (!$content) {
throw new HttpRequestException($url . ':' . $data);
}
三類日誌分離存儲 app/lib/log/:
// 推送任務
Queue::push('SendEmailJob', ['user_id' => 123, 'template' => 'welcome']);
// 任務類實現 fire 方法
class SendEmailJob {
public function fire($job, $data) {
// 發送郵件邏輯
$job->delete(); // 刪除任務
// 或延遲重試
// $job->release(30); // 30秒後重試
// 獲取嘗試次數
// $attempts = $job->attempts();
}
}
啟動監聽:php artisan queue:listen --env=dev &(建議使用 Supervisor 進程管理)
驅動選型:Redis > Beanstalkd > Database > Sync,Redis 性能最優且支持延遲隊列。
// app/config/param.php 定義各接口驗證規則
// app/filters.php
App::before(function($request) {
$standard = Config::get('param.' . Route::currentRouteName());
$res = Param::verification(Input::all(), $standard);
if (!$res) throw new ValidationException('參數錯誤');
});
App::after(function($request, $response) {
RequestLog::log($request, $response);
});
app/config/ ├── dev/ # 開發環境 ├── formal/ # 正式環境 └── local/ # 本地環境
// bootstrap/start.php
$env = $app->detectEnvironment([
'dev' => ['dev.domain.com'],
'formal' => ['domain.com'],
'local' => ['localhost', '*.local'],
]);
Laravel 根據 $_SERVER['HTTP_HOST'] 匹配數組鍵名,命中即加載對應目錄配置,實現零代碼修改部署多環境。
這些模式在 Laravel 現代版本中依然適用,只是實現方式升級為 Service Provider、Middleware、Event/Listener、Custom Exception Handler 等更優雅的機制。