基于Redis的快照模型实现

实现要求:

对模型对象以及关联信息,在需要时能方便地做到快速映射,获取,删除。


举例说明:

-- 销售订单(SalesOrder)及其子项(SalesOrderItem),需要在用户下单后,支付后或其他状态改变时进行快照。


步骤:

- 安装 yii2-redis 扩展

composer.phar require --prefer-dist yiisoft/yii2-redis:"~2.0.0"


- 建立快照模型,继承common\models\c2\redis\ActiveRecord, 里面做了定制化primaryKey, 并加入了时间戳等behaviors。

common\models\c2\redis\snapshot\SalesOrder

  • 以 [code, s_checkpoint] 为 primaryKey
  • 规定了这个快照的属性,包括原实体模型的属性,相关联的标签属性也加入,比如支付方法,支付号,支付状态,收货地址等
  • 与common\models\c2\redis\snapshot\SalesOrder\SalesOrderItem建立关系,增删时的关联操作


common\models\c2\redis\snapshot\SalesOrder\SalesOrderItem

  • 规定了这个快照的属性,包括原实体模型的属性,相关联的标签属性也加入,比如货品号,货品价格等


- 建立 SnapshotBehavior, 为实体类提供快照方法

  • getSnapshotAttributes() - 返回实体类实际映射的属性,快照保存时使用
  • takeSnapshot($checkpoint = "") - 根据检查点存储该模型映射的快照
  • getSnapshot($checkpoint = "")- 根据检查点获取该模型映射的快照
  • deleteSnapshot($checkpoint = "")- 根据检查点删除该模型映射的快照


- 修改实体类 SalesOrder

  • public function behaviors() {
            return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [
                        'snapshotBehavior' => [
                            'class' => \common\behaviors\SnapshotBehavior::class,
                            'snapshotClass' => \common\models\c2\redis\snapshot\SalesOrder::class,
                            'primaryKey' => 'code',
                        ],
            ]);
        }
  • 实现 getSnapshotAttributes() 方法,指定具体属性


测试

$model = \common\models\c2\entity\SalesOrder::findOne(['code' => $code]);
$result = $model->takeSnapshot(SalesOrderStateType::TYPE_PAYED);
$ssModel = $model->getSnapshot(SalesOrderStateType::TYPE_PAYED);
$result = $model->deleteSnapshot(SalesOrderStateType::TYPE_PAYED);



你可能感兴趣的:(项目开发,Yii2)