微服務之數據庫服務-客戶端(PHP+YII)

以YII、自定義數據操作兩種方式組成的數據庫微服務的客戶端。

類介紹

Base類

Dg_Db_Base,繼承自Dg_Db_Yii類

class Dg_Db_Base extends Dg_Db_Yii {

}

Yii類

Dg_Db_Yii,繼承自Dg_Db_Hnb類,以YII框架的方式調用數據庫。

實現思路:
1,通過魔術函數(__call、__callStatic、__set),獲取函數調用鏈中的信息並存儲。
2,將獲取的調用鏈中的信息請求至服務端。
3,服務端通過函數(call_user_func_array、forward_static_call_array),調用YII提供的相關函數。

/**
 * 數據庫操作基類,基於Yii框架。繼承後即可使用Yii框架中的操作數據庫的方式。
 * 操作數據庫可以分爲如下三類(可以參考Yii2中的使用說明)
 * 一、Command操作,以commandDone函數結尾。
 *  Model::getInstance()->createCommand({查詢語句})->queryAll()->commandDone();
 *  Model::getInstance()->createCommand({修改語句})->execute()->commandDone();
 *  Model::getInstance()->createCommand()->insert('{表名}', ['{字段}'=>'{值}'], '{條件}')->execute()->commandDone();
 *  Model::getInstance()->createCommand()->update('{表名}', ['{字段}'=>'{值}'], '{條件}')->execute()->commandDone();
 *  Model::getInstance()->createCommand()->delete('{表名}','{條件}')->execute()->commandDone();
 * 二、ActiveRecord操作,以recordDone函數結尾。
 *  查詢
 *  Model::find()->select('f_id,name')->where([f_id'=>'5'])->limit(10)->all()->recordDone();
 *  Model::findOne(3)->recordDone();
 *  Model::findAll([1,3,5])->recordDone();
 *  Model::findAll(['f_id'=>3])->recordDone();
 *  插入
 *  $obj = Model::getInstance();
 *  $obj->name = '西米';
 *  $obj->save()->recordDone();
 *  更新
 *  $obj = Model::findOne(7);
 *  $obj->name = '西米123';
 *  $obj->save()->recordDone();
 *  刪除
 *  $obj = Model::findOne(7);
 *  $obj->delete()->recordDone();
 *  遞增
 *  Model::updateAllCounters(['f_create_time' => 10])->recordDone();
 * 三、Query操作,以queryDone函數結尾
 *  Model::getInstance()->select('f_id,f_name,f_email')->from('t_transact_user_info')->where(['f_id'=>'1513'])->limit(10)->all()->queryDone();
 */
class Dg_Db_Yii extends Dg_Db_Hnb {

    private $_callArr = array();
    public function __call($fun, $arguments)
    {
        $this->_callArr[$fun] = !empty($arguments) ? $arguments : '';
        return $this;
    }

    private static $_callStaticArr = array();
    public function __callStatic($fun, $arguments)
    {
        $class = get_called_class();
        $self  = new $class();
        self::$_callStaticArr[$fun] = !empty($arguments) ? $arguments : '';
        return $self;
    }

    private $_callSetArr = array();
    public function __set($name, $value)
    {
        $this->_callSetArr[$name] = $value;
    }

    /**
     * 執行
     */
    private function done($type = 'index')
    {
        $this->init();
        // 請求
        $requestParam = array(
            '_call'       => $this->_callArr,
            '_callStatic' => self::$_callStaticArr,
            '_callSet'    => $this->_callSetArr,
        );
        $url    = $this->getRequestUrl('query', $type);
        $result = $this->getRequestText($url, $requestParam);
        $result = json_decode($result, true);

        if ( !$result['state'] && !empty($result['data']) ) {
            unset($this->_callArr);
            self::$_callStaticArr = array();
            // 數據解密處理
            if ( count($result['data']) == count($result['data'],1) ) {
                $result['data'] = current($this->_decryptyData(array($result['data'])));
            } else {
                $result['data'] = $this->_decryptyData($result['data']);
            }
        }
        return $this->formatResult($result);
    }

    /**
     * 返回數據格式化
     */
    public function format($default = '')
    {
        $this->_formatResult = true;
        $this->_formatDefault= $default;
        return $this;
    }

    /**
     * Yii\db\Query命令請求
     */
    public function queryDone()
    {
        return $this->done('index');
    }

    /**
     * Yii\db\ActiveRecord命令請求
     */
    public function recordDone()
    {
        return $this->done('record');
    }

    /**
     * Yii\db\Command命令請求
     */
    public function commandDone()
    {
        return $this->done('command');
    }

}

Hnb類

Dg_Db_Hnb,自定義的數據庫調用方式。

實現思路:
1,自定義操作數據庫相關的函數,如query、queryWithTotal、detail、countNum、insert、update等函數。
2,將相關參數請求至服務端並調用對應的函數(服務端需要定義相關的函數操作數據庫)。

/**
 * 數據庫操作基類,繼承後即可使用數據庫操作相關的函數
 * 查詢函數,query、queryWithTotal、one、detail、countNum
 * 操作函數,insert、insertMulit、replace、replaceMulti、update、delete、incr
 * 事務函數,startTransct、commitTransact、rollbackTransact
 * 配置函數,setDbType、setDbName、setTable、setField
 */

class Dg_Db_Hnb extends Dg_Singleton {

    /**
     * 查詢數據
     * @param  array   $param 查詢條件,條件數組或者條件SQL
     * @param  string  $order 排序規則
     * @param  string  $limit 獲取條數
     * @param  string  $field 查詢的列,默認爲*
     * @param  string  $group 分組規則
     * @return array   數據列表
     */
    public function query($param = array(), $order = false, $limit = false, $field = '*', $group = false)
    {
        $param = $this->_encryptyParam($param);
        $requestParam = array(
            'param'  => serialize($param),
            'order'  => strval($order),
            'limit'  => strval($limit),
            'field'  => strval($field),
            'group'  => strval($group),
        );
        $url    = $this->getRequestUrl('dql', __FUNCTION__);
        $result = $this->getRequestText($url, $requestParam);
        $result = json_decode($result, true);
        if ( !$result['state'] && !empty($result['data']) ) {
            $result['data'] = $this->_decryptyData($result['data']);
        }
        return $this->formatResult($result, array());
    }

    /**
     * 查詢一條數據
     * @param  array   $param 查詢條件,條件數組或者條件SQL
     * @param  string  $field 查詢的列,默認爲*
     * @return array   數據
     */
    public function detail($param, $field = '*')
    {
        $param = $this->_encryptyParam($param);
        $requestParam = array(
            'param'  => serialize($param),
            'field'  => strval($field),
        );
        $url    = $this->getRequestUrl('dql', __FUNCTION__);
        $result = $this->getRequestText($url, $requestParam);
        $result = json_decode($result, true);
        if ( !$result['state'] && !empty($result['data']) ) {
            $result['data'] = current($this->_decryptyData(array($result['data'])));
        }
        return $this->formatResult($result, array());
    }

    /**
     * 刪除數據
     * @param  array $param 查詢參數,同query
     * @return array(
     *      'state' => 0(0成功,其他錯誤碼),
     *      'errorCode' => '',
     *      'data' => ''(錯誤信息或者受影響的行數)
     *  )
     */
    public function delete($param)
    {
        $param= $this->_encryptyParam($param);
        $requestParam = array(
            'param'  => serialize($param),
        );
        $this->getRequestParam($requestParam);
        $url    = $this->getRequestUrl('dml', __FUNCTION__, 'post');
        $result = $this->getPostText($url, $requestParam);
        return json_decode($result, true);
    }
}

使用說明

繼承自Dg_Db_Base類型
以YII方式調用

Model::find()->select("*")->where($whereParam)->orderBy($order)->offset($offset)->limit($num)->all()->recordDone();

自定義方式調用

Model::getInstance()->query($where , $order , $limit);

源碼

下載源碼

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