微服务之数据库服务-客户端(PHP+YII)

来源:互联网 发布:徐老师淘宝外设店 编辑:程序博客网 时间:2024/06/07 03:39

以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);

源码

下载源码

阅读全文
0 0
原创粉丝点击