事件系统.md 5.3 KB

用户模块事件系统

1. 概述

用户模块的事件系统用于在用户生命周期的关键节点触发事件,允许其他模块或系统组件响应这些事件并执行相应的操作。这种设计实现了模块间的松耦合,提高了系统的可扩展性和可维护性。

2. 事件定义

2.1 UserCreatedEvent

当新用户创建时触发。

事件类: App\Module\User\Events\UserCreatedEvent

事件数据:

/**
 * 用户模型
 * @var User
 */
public User $user;

触发时机:

  • 通过UserService::create方法创建用户
  • 通过API接口注册用户

2.2 UserUpdatedEvent

当用户信息更新时触发。

事件类: App\Module\User\Events\UserUpdatedEvent

事件数据:

/**
 * 用户模型
 * @var User
 */
public User $user;

/**
 * 更新前的数据
 * @var array
 */
public array $original;

触发时机:

  • 通过UserService::update方法更新用户
  • 通过API接口更新用户信息

2.3 UserStatusChangedEvent

当用户状态变更时触发。

事件类: App\Module\User\Events\UserStatusChangedEvent

事件数据:

/**
 * 用户模型
 * @var User
 */
public User $user;

/**
 * 变更前的状态
 * @var int
 */
public int $oldStatus;

/**
 * 变更后的状态
 * @var int
 */
public int $newStatus;

触发时机:

  • 通过UserService::changeStatus方法变更用户状态
  • 通过API接口变更用户状态

2.4 UserInfoUpdatedEvent

当用户详细信息更新时触发。

事件类: App\Module\User\Events\UserInfoUpdatedEvent

事件数据:

/**
 * 用户信息模型
 * @var UserInfo
 */
public UserInfo $userInfo;

/**
 * 更新前的数据
 * @var array
 */
public array $original;

触发时机:

  • 通过UserService::updateInfo方法更新用户详细信息
  • 通过API接口更新用户详细信息

3. 事件监听器

3.1 UserEventListener

监听用户相关事件,执行相应的操作。

监听器类: App\Module\User\Listeners\UserEventListener

职责:

  • 处理用户创建事件,记录日志
  • 处理用户更新事件,记录日志
  • 处理用户状态变更事件,记录日志
  • 处理用户信息更新事件,记录日志

4. 事件注册

用户模块通过服务提供者注册事件和监听器:

/**
 * 用户模块服务提供者
 */
class UserServiceProvider extends ServiceProvider
{
    /**
     * 事件到监听器的映射
     *
     * @var array
     */
    protected $listen = [
        UserCreatedEvent::class => [
            UserEventListener::class . '@handleUserCreated',
        ],
        UserUpdatedEvent::class => [
            UserEventListener::class . '@handleUserUpdated',
        ],
        UserStatusChangedEvent::class => [
            UserEventListener::class . '@handleUserStatusChanged',
        ],
        UserInfoUpdatedEvent::class => [
            UserEventListener::class . '@handleUserInfoUpdated',
        ],
    ];

    /**
     * 需要注册的订阅者
     *
     * @var array
     */
    protected $subscribe = [
        UserEventListener::class,
    ];

    // ...
}

5. 使用示例

5.1 触发事件

// 创建用户后触发事件
$user = User::create($userData);
event(new UserCreatedEvent($user));

// 更新用户后触发事件
$original = $user->getOriginal();
$user->update($userData);
event(new UserUpdatedEvent($user, $original));

// 变更用户状态后触发事件
$oldStatus = $user->status2;
$user->status2 = $newStatus;
$user->save();
event(new UserStatusChangedEvent($user, $oldStatus, $newStatus));

// 更新用户信息后触发事件
$original = $userInfo->getOriginal();
$userInfo->update($userInfoData);
event(new UserInfoUpdatedEvent($userInfo, $original));

5.2 监听事件

// 在其他模块中监听用户事件
protected $listen = [
    UserCreatedEvent::class => [
        SendWelcomeEmailListener::class,
    ],
    UserStatusChangedEvent::class => [
        NotifyUserStatusChangeListener::class,
    ],
];

6. 与其他模块的集成

用户模块的事件系统可以与其他模块集成,实现跨模块功能:

6.1 与通知模块集成

通知模块可以监听用户事件,向相关用户发送通知:

// 在通知模块的服务提供者中
protected $listen = [
    UserCreatedEvent::class => [
        SendWelcomeNotificationListener::class,
    ],
    UserStatusChangedEvent::class => [
        SendStatusChangeNotificationListener::class,
    ],
];

6.2 与统计模块集成

统计模块可以监听用户事件,更新相关统计数据:

// 在统计模块的服务提供者中
protected $listen = [
    UserCreatedEvent::class => [
        UpdateUserStatisticsListener::class,
    ],
    UserStatusChangedEvent::class => [
        UpdateActiveUserStatisticsListener::class,
    ],
];

6.3 与日志模块集成

日志模块可以监听用户事件,记录详细的操作日志:

// 在日志模块的服务提供者中
protected $listen = [
    UserCreatedEvent::class => [
        LogUserCreationListener::class,
    ],
    UserUpdatedEvent::class => [
        LogUserUpdateListener::class,
    ],
    UserStatusChangedEvent::class => [
        LogUserStatusChangeListener::class,
    ],
    UserInfoUpdatedEvent::class => [
        LogUserInfoUpdateListener::class,
    ],
];