想实现这样一个功能: 开展一个网站邀请活动, 然后参与者 (owner) 将推广的网站地址链接发给好友, 好友点击链接后在网站注册成功, owner 的邀请日志记录条数加 1
活动类 Activity
代码如下:
- class Activity extends ElggEntity {
- private $strategy; // 用于保存策略实例
- public
- function __construction($guid) {...$this - >load($guid); // 载入实体
- }
- public
- function addLog($data) {
- $this - >strategy - >addLog($data); // 实际是 DEFAULTActivityStrategy::addLog($data)
- }
- public
- function load($guid) {
- if (parent: :load($guid)) { // 此过程会将本实例的所有属性从数据库中赋值, 因此 $this->strategyName 的值已经被赋上了
- if ($this - >strategyName != '') {
- $this - >strategy = AbstractActivityStrategy: :getInstance($this - >strategyName); // 加载策略类
- }
- return true;
- }
- return false;
- }
- }
日志类 ActivityLog
代码如下:
- class ActivityLog extends ElggEntity {
- $private countValue; // 邀请记录数
- ...
- }
策略类
说明: ElggEntity: 所有实体基类 AbstractActivityStrategy: 活动抽象类
)首先创建一个活动:
代码如下:
- $activity = new Activity();
- $activity->name = 'KKND'; // 活动名称
- $activity->strategyName = 'DEFAULT'; // 策略名称
- $activity->save(); // 将活动类保存至数据库, 新添加的属性 (比如 strategyName) 也会保存
)别人收到邀请, 点击链接后, owner 的邀请记录条目 + 1
比如邀请网址是 http://www.xinwusi.com/KKND/1234
其中 / KKND / 是活动名称, 1234 是 owner 的 guid, 假设该活动的 guid 为 8888, 则
- $activity = new Activity(8888); // 获取活动实体
- $activity->addLog($data); // 添加邀请记录 $data 包括 owner 的 guid, 活动的 guid, 活动名 name 等
最后 2 行代码的过程, 就是读取了该活动实体的策略名, 并根据这个策略名生成一个策略实体, 保存在自己的 $stragety 属性里, 再调用其中的 addLog 方法增加日志记录
以后有新活动的时候, 直接把活动实例属性的策略名改了, 就可以调用对应新策略中的方法了
代码如下:
- class DEFAULTActivityStrategy extends AbstractActivityStrategy {
- ...
- public function addLog($data) {
- $activityLog = new ActivityLog();
- ...
- $activityLog->save();
- $activityLogAmount = new ActivityLogAmount(); // 计数类
- ...
- $activityLogAmount->countValue += 1;
- $activityLogAmount->save();
- }
- }
来源: https://www.php1.cn/detail/php-2377a74b1f.html