項目組不久前引進了laravel框架,本人蔘與了laravel的調研和項目架構設計。我的認爲項目架構中基於laravel的有些設計仍是比較實用和有借鑑性的,現將一些設計分享給你們,但願能和你們共同窗習和探討。特別說明,本文並不是對lavarel官方文檔的摘抄或總結。php
1.1異常類laravel
異常類統一放在app/lib/exception下,能夠根據業務模塊再細分,對簡寫的異常類可採用一個文件多個異常類的形式,如:redis
class HttpRequestException extends Exceptionbootstrap
{架構
}app
class HttpResponseException extends Exception框架
{dom
}異步
1.2捕獲機制工具
能夠在任意須要的地方作異常捕獲,若是不捕獲,異常將拋出至最外層。
拋出到最外層的異常,統一在app/start/global.php文件中定義handler
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);
});
1.3拋出機制
可在任意可觸發異常的地方,拋出異常。
RequestLog::request($url, $data, $start, $content);
if (!$content) {
throw new HttpRequestException($url . ':' . $data);
}
分三類log:接口調用log(RequestLog)、業務log(LogicaltLog)、調試log(DebugLog)。日誌統一放在app/lib/log目錄下。其中RequestLog可用於接口調用的統計分析,LogicaltLog能夠用於記錄邏輯數據,DebugLog用於輸出調試信息(也可直接用laravel自帶的\Log類)。
Laravle封裝了Queue用來作任務隊列,用來作異步處理很是方便。支持: "sync", "beanstalkd", "sqs", "iron", "redis"五種形式。建議用redis,超級好用。
隊列使用方法只要將任務類的類名壓入隊列,而且該任務類實現了fire方法,就可使用了。
在fire($job, $data)裏,咱們還能夠拿到任務的嘗試次數$job->attempts() ,能夠延遲任務響應時間$job->release(30);還能夠刪掉任務$job->delete();。
最後特別提醒,能夠經過laravel框架的artisan工具啓動隊列監聽:
php ../../../../artisan --env=devqueue:listen&
Filter能夠用來作參數驗證、登錄態檢查、接口調用日誌。
4.1參數檢查
在app /config/param.php裏定義各接口的參數驗證條件。驗證條件自行參考laravel文檔。
而後在app /Filter.php的Before裏,對每個調用進行參數驗證,如:
App::before(function($request))
{
…
$res = Param::verification(Input::all(), $standard);
…
}
4.2接口調用日誌
App::after(function($request, $response)
{
…
RequestLog::log($request, $response);
…
});
一般,咱們的框架會有好幾套環境:正式、測試、本地、沙盒等,不一樣的環境配置確定會有不一樣。Laravel容許在進程start的時候,指定當前配置環境,從而作到不一樣環境之間的自動切換。
1) 不一樣的環境配置目錄:
app\config\dev
app\config\formal
app\config\local
2)bootstrap/start.php指定須要的環境,例如測試環境dev
$env = $app->detectEnvironment(‘dev’)
3) 如何自動切換?
咱們能夠作到根據接口請求訪問的域名不一樣,指定相應的環境。好比dev.domain.com爲測試環境,domain.com爲正式環境。