微服务之数据库服务-客户端(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);

源码

下载源码

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