Redisベースのスナップショットモデル実装
実装要件:
モデルオブジェクトおよび関連情報は、必要に応じて迅速にマッピング、取得、削除することができます.
例:
--SalesOrderとそのサブアイテム(SalesOrderItem)は、ユーザーが注文した後、支払い後またはその他のステータスが変更されたときにスナップショットする必要があります.
手順:
-yii 2-redis拡張子のインストール
-スナップショットモデルを作成し、commonmodelsc 2redisActiveRecordを継承し、primaryKeyをカスタマイズし、タイムスタンプなどのbehaviorsを追加しました.
common\models\c2\redis\snapshot\SalesOrder[code,s_checkpoint]をprimaryKey とするはこのスナップショットの属性を規定しており、元のソリッドモデルの属性を含む、関連するラベル属性も加えられている.例えば、支払方法、支払番号、支払状態、出荷先アドレスなど である. commonmodelsc 2redissnapshotSalesOrderSalesOrderItemとの関係を確立し、削除時の関連操作 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);
モデルオブジェクトおよび関連情報は、必要に応じて迅速にマッピング、取得、削除することができます.
例:
--SalesOrderとそのサブアイテム(SalesOrderItem)は、ユーザーが注文した後、支払い後またはその他のステータスが変更されたときにスナップショットする必要があります.
手順:
-yii 2-redis拡張子のインストール
composer.phar require --prefer-dist yiisoft/yii2-redis:"~2.0.0"
-スナップショットモデルを作成し、commonmodelsc 2redisActiveRecordを継承し、primaryKeyをカスタマイズし、タイムスタンプなどのbehaviorsを追加しました.
common\models\c2\redis\snapshot\SalesOrder
-SnapshotBehaviorを作成し、エンティティクラスのスナップショット方法を提供します.
-エンティティクラスSalesOrderの変更
テスト
$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);