活动模块使用事件系统实现模块间的松耦合通信,通过定义和触发事件,使其他模块能够响应活动系统中的关键行为,而无需直接依赖活动模块的内部实现。
事件系统基于Laravel的事件机制实现,包括事件定义、事件监听器和事件分发。
当新活动被创建时触发此事件。
事件属性:
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 活动名称
* @var string
*/
public string $activityName;
/**
* 活动类型
* @var int
*/
public int $activityType;
/**
* 活动开始时间
* @var string
*/
public string $startTime;
/**
* 活动结束时间
* @var string
*/
public string $endTime;
/**
* 创建者ID
* @var int
*/
public int $creatorId;
触发时机:
当活动状态发生变化时触发此事件。
事件属性:
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 活动名称
* @var string
*/
public string $activityName;
/**
* 旧状态
* @var int
*/
public int $oldStatus;
/**
* 新状态
* @var int
*/
public int $newStatus;
/**
* 状态变更原因
* @var string
*/
public string $reason;
/**
* 状态变更时间
* @var string
*/
public string $changedAt;
触发时机:
当用户参与活动时触发此事件。
事件属性:
/**
* 用户ID
* @var int
*/
public int $userId;
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 活动类型
* @var int
*/
public int $activityType;
/**
* 参与时间
* @var string
*/
public string $participateTime;
/**
* 参与渠道
* @var string
*/
public string $channel;
触发时机:
当用户在活动中的进度更新时触发此事件。
事件属性:
/**
* 用户ID
* @var int
*/
public int $userId;
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 旧进度
* @var int
*/
public int $oldProgress;
/**
* 新进度
* @var int
*/
public int $newProgress;
/**
* 进度数据
* @var array
*/
public array $progressData;
/**
* 更新时间
* @var string
*/
public string $updatedAt;
触发时机:
当用户完成活动时触发此事件。
事件属性:
/**
* 用户ID
* @var int
*/
public int $userId;
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 活动名称
* @var string
*/
public string $activityName;
/**
* 活动类型
* @var int
*/
public int $activityType;
/**
* 完成时间
* @var string
*/
public string $completedAt;
/**
* 可获得的奖励
* @var array
*/
public array $rewards;
触发时机:
当用户领取活动奖励时触发此事件。
事件属性:
/**
* 用户ID
* @var int
*/
public int $userId;
/**
* 活动ID
* @var int
*/
public int $activityId;
/**
* 奖励ID列表
* @var array
*/
public array $rewardIds;
/**
* 实际发放的奖励
* @var array
*/
public array $actualRewards;
/**
* 领取时间
* @var string
*/
public string $claimedAt;
触发时机:
监听活动状态变更事件,执行相关操作。
职责:
监听用户参与活动事件,处理参与逻辑。
职责:
监听活动进度更新事件,处理进度相关逻辑。
职责:
监听奖励领取事件,处理奖励发放逻辑。
职责:
活动模块通过服务提供者注册事件和监听器:
/**
* 活动模块服务提供者
*/
class ActivityServiceProvider extends ServiceProvider
{
/**
* 事件到监听器的映射
*
* @var array
*/
protected $listen = [
ActivityCreatedEvent::class => [
ActivityCreatedListener::class,
],
ActivityStatusChangedEvent::class => [
ActivityStatusChangeListener::class,
],
UserParticipatedEvent::class => [
UserParticipationListener::class,
],
ActivityProgressUpdatedEvent::class => [
ActivityProgressListener::class,
],
ActivityCompletedEvent::class => [
ActivityCompletedListener::class,
],
ActivityRewardClaimedEvent::class => [
RewardDistributionListener::class,
],
];
/**
* 注册服务
*/
public function register()
{
// 注册服务...
}
/**
* 启动服务
*/
public function boot()
{
// 注册事件监听器
parent::boot();
}
}
// 在活动创建逻辑中
public function createActivity(array $data)
{
// 创建活动记录
$activity = ActivityConfig::create([
'name' => $data['name'],
'type' => $data['type'],
'start_time' => $data['start_time'],
'end_time' => $data['end_time'],
// 其他字段...
]);
// 触发活动创建事件
event(new ActivityCreatedEvent(
$activity->id,
$activity->name,
$activity->type,
$activity->start_time,
$activity->end_time,
auth()->id()
));
return $activity;
}
// 在用户参与活动逻辑中
public function participateActivity(int $userId, int $activityId)
{
// 检查参与条件...
// 记录参与情况
$participation = ActivityParticipation::create([
'user_id' => $userId,
'activity_id' => $activityId,
'participate_time' => now(),
'reward_status' => 0,
]);
// 初始化用户活动数据
UserActivityData::create([
'user_id' => $userId,
'activity_id' => $activityId,
'progress' => 0,
]);
// 获取活动信息
$activity = ActivityConfig::find($activityId);
// 触发用户参与活动事件
event(new UserParticipatedEvent(
$userId,
$activityId,
$activity->type,
now()->toDateTimeString(),
'app'
));
return $participation;
}
活动模块的事件系统可以与其他模块集成,实现跨模块功能:
通知模块可以监听活动事件,向用户发送相关通知:
// 在通知模块的服务提供者中
protected $listen = [
ActivityCreatedEvent::class => [
SendActivityNotificationListener::class,
],
ActivityStatusChangedEvent::class => [
SendActivityStatusChangeNotificationListener::class,
],
ActivityRewardClaimedEvent::class => [
SendRewardClaimNotificationListener::class,
],
];
任务模块可以监听活动事件,更新相关任务进度:
// 在任务模块的服务提供者中
protected $listen = [
UserParticipatedEvent::class => [
UpdateActivityParticipationTaskListener::class,
],
ActivityCompletedEvent::class => [
UpdateActivityCompletionTaskListener::class,
],
];
统计模块可以监听活动事件,收集活动相关数据:
// 在统计模块的服务提供者中
protected $listen = [
UserParticipatedEvent::class => [
RecordActivityParticipationStatListener::class,
],
ActivityRewardClaimedEvent::class => [
RecordRewardDistributionStatListener::class,
],
ActivityCompletedEvent::class => [
RecordActivityCompletionStatListener::class,
],
];