程序開發的一些常規套路(一)

進入軟件開發許久,期間做過Android,玩過opencv,做過小程序,寫過TP5的接口。現在將一些軟件開發上的常規套路分享給大家。服務器方面將會以TP5框架爲例,客戶端則以微信小程序爲例。

服務器方面

(以TP5爲例)
服務器開發人員主要的工作就是寫接口了。包括處理客戶端傳遞過來的數據,以及將數據庫中的信息傳遞給客戶端。個人理解,項目開發之前,首先要做的就是設計數據庫,理解表與表之間的關係,這一點對服務器開發人員尤爲重要,因爲接口中的內容歸根揭底都是表與表之間的關係。

無論是後臺服務器還是前臺客戶端,項目開發的第一步就是寫好基類,將基本的框架功能搭建好。也許公司有框架,但是你不能否認這一步真的能爲後面的工作節省很多的時間。接下來,從TP5的角度開發,說說我自己在開發上的一些常規套路。

大家都知道,服務器在無論在線下開發測試的時候,還是在線上都會遇到異常,在我們公司,是通過客戶端可解析得json字符串來向客戶端反饋的。一般,把可預計的異常的都拋出去,在客戶端進行異常處理。只有在服務器按計劃正確執行了的代碼,才能在客戶端進行正確的響應。在這裏用到的方法就是抽取異常基類以及定義全局異常了。
抽取異常基類
首先我們來看看在客戶端顯示的數據是怎麼樣的。
當服務器遇到異常時,響應的數據。

異常顯示

服務器正確響應時反饋給客戶端的數據
image.png

這裏先來說說,響應異常時的處理方法。可以看出異常時json字符串中有statue msg errorCode 以及 url,我們在自己寫的BaseException(繼承TP5中的Exception)定義這幾個字段。會在自定義全局HandLer中遇上。下面來具體看看代碼
正確響應時候調用的方法,我們可以將它抽取到基類中,當然也可以定義公共php文件common.php

function  show($status, $message,$data=array()) {
    $reuslt = array(
        'status' => $status,
        'msg' => $message,
        'data' => $data,
    );

    exit(json_encode($reuslt));
}
class BaseException extends Exception
    {
        //以下定義的變量 在全局異常處理類中會用到
        public $status=0;//服務器狀態碼 0代表異常,1代表正確響應
        public $code =400;//Http狀態碼 404 .402
        public $msg="param error";//錯誤具體信息
        public $errorCode=10000;//自定義錯誤碼

        /**
         * 構造函數,接收一個關聯數組
         * @param array $params 關聯數組只應包含code、msg和errorCode,且不應該是空值
         */
        public function __construct($params=[])
        {
            if(!is_array($params)){
                return;
            }
            if(array_key_exists('code',$params)){
                $this->code = $params['code'];//將傳遞過來的值賦值給成員變量(java裏的說法)
            }
            if(array_key_exists('msg',$params)){
                $this->msg = $params['msg'];
            }
            if(array_key_exists('errorCode',$params)){
                $this->errorCode = $params['errorCode'];
            }
            if(array_key_exists('status',$params)){
                $this->errorCode = $params['status'];
            }
        }
    }

需要注意的是BaseException的構造方法,這裏運用的比較巧妙,通過這種方式,我們可以很直接的在BaseException中自定義傳遞給客戶端的參數,方便前臺開發人員做出正確的響應。
示例

throw new BaseException([
            "msg"=>"測試異常",
            "statue"=>1,
            "errorCode"=>10011]);
示例效果

定義全局異常處理
當然想要達到以上的效果,只定義基類異常還是不行的。還需要另外自定義全局異常處理。在TP5框架當中的config.php文件中有一個exception_handle變量,用來指定服務器異常時要調用的handler處理方法。我們可以將它的路徑設置爲我們自己所寫的繼承了Handler的類來實現全局異常。

   // 異常處理handle類 留空使用 \think\exception\Handle
    'exception_handle'       => 'app\lib\exception\ExceptionHandler',//自定義異常路徑

ExceptionHandler是我們自定義的異常,繼承自TP5框架的Handler,而在Hanler中有一個render方法,在其中可以接受來自後臺拋出的Exception,從而做出對客戶端的響應。我們可以在子類中重定義這個方法,輸出json字符串,來達到上面示例中的效果。下面來看看具體代碼。

class ExceptionHandler extends Handle
{
    //以下定義的變量是響應給客戶端的
    public $code;
    public $msg;
    public $errorCode;
    public $status;

    public function render(Exception $e)
    {//傳遞過來的Exception是程序捕獲的到,可以是我們自己人爲拋出
        if ($e instanceof BaseException) {
            //進行判斷如果是我們自定義的異常,則輸出自定義異常信息
            $this->code = $e->code;//將BaseException中的值賦值給成員變量,最後進行輸出
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
            $this->status = $e->status;
        } else {
            $switch = true;
            if (config('app_debug')) {//判斷是否爲調試模式,
                //返回默認界面
                return parent::render($e);
            } else {
                //返回json數據
                $this->code = 500;
                $this->msg = "服務器內部錯誤";
                $this->errorCode = 999;
                $this->status = 0;
                $this->recordLog($e);
            }

        }
        $request = Request::instance();
        $result = [
            "status" => $this->status,
            "msg" => $this->msg,
            "errorCode" => $this->errorCode,
            "url" => $request->url()
        ];

        return json($result, $this->code);
    }

    //記錄日誌方法
    private function recordLog(Exception $e)
    {
        Log::init([
            'type' => 'File',
            'path' => LOG_PATH,
            'level' => ['error'],
        ]);
        Log::record($e->getMessage(), 'error');
    }
}

由於篇幅受限,就先說到這裏。喜歡的可以點個關注,下期繼續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章