事件系统.md 5.1 KB

文件模块事件系统

1. 概述

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

2. 事件定义

2.1 FileUploadedEvent

当新文件上传时触发。

事件类: App\Module\File\Events\FileUploadedEvent

事件数据:

/**
 * 文件模型
 * @var FileFile
 */
public FileFile $file;

触发时机:

  • 通过FileLogic::uploadFile方法上传文件
  • 通过API接口上传文件

2.2 ImageUploadedEvent

当新图片上传时触发。

事件类: App\Module\File\Events\ImageUploadedEvent

事件数据:

/**
 * 图片模型
 * @var FileImg
 */
public FileImg $image;

触发时机:

  • 通过FileLogic::uploadImage方法上传图片
  • 通过API接口上传图片

2.3 FileDeletedEvent

当文件删除时触发。

事件类: App\Module\File\Events\FileDeletedEvent

事件数据:

/**
 * 文件ID
 * @var int
 */
public int $fileId;

/**
 * 文件路径
 * @var string
 */
public string $filePath;

/**
 * 存储磁盘
 * @var string
 */
public string $storageDisk;

触发时机:

  • 通过FileLogic::deleteFile方法删除文件
  • 通过API接口删除文件

2.4 ImageDeletedEvent

当图片删除时触发。

事件类: App\Module\File\Events\ImageDeletedEvent

事件数据:

/**
 * 图片ID
 * @var int
 */
public int $imageId;

/**
 * 图片路径
 * @var string
 */
public string $imagePath;

/**
 * 存储磁盘
 * @var string
 */
public string $storageDisk;

触发时机:

  • 通过FileLogic::deleteImage方法删除图片
  • 通过API接口删除图片

3. 事件监听器

3.1 FileEventListener

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

监听器类: App\Module\File\Listeners\FileEventListener

职责:

  • 处理文件上传事件,记录日志
  • 处理图片上传事件,记录日志
  • 处理文件删除事件,记录日志,清理存储
  • 处理图片删除事件,记录日志,清理存储

4. 事件注册

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

/**
 * 文件模块服务提供者
 */
class FileServiceProvider extends ServiceProvider
{
    /**
     * 事件到监听器的映射
     *
     * @var array
     */
    protected $listen = [
        FileUploadedEvent::class => [
            FileEventListener::class . '@handleFileUploaded',
        ],
        ImageUploadedEvent::class => [
            FileEventListener::class . '@handleImageUploaded',
        ],
        FileDeletedEvent::class => [
            FileEventListener::class . '@handleFileDeleted',
        ],
        ImageDeletedEvent::class => [
            FileEventListener::class . '@handleImageDeleted',
        ],
    ];

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

    // ...
}

5. 使用示例

5.1 触发事件

// 上传文件后触发事件
$fileModel = $this->uploadFile($file, $userId, $reType, $reId);
event(new FileUploadedEvent($fileModel));

// 上传图片后触发事件
$imageModel = $this->uploadImage($file, $userId, $private, $reType, $reId);
event(new ImageUploadedEvent($imageModel));

// 删除文件后触发事件
$file = FileFile::find($fileId);
$path = $file->path;
$disk = StorageConfig::getStorage();
$file->delete();
event(new FileDeletedEvent($fileId, $path, $disk));

// 删除图片后触发事件
$image = FileImg::find($imageId);
$path = $image->path;
$disk = $image->storage_disk;
$image->delete();
event(new ImageDeletedEvent($imageId, $path, $disk));

5.2 监听事件

// 在其他模块中监听文件事件
protected $listen = [
    FileUploadedEvent::class => [
        LogFileUploadListener::class,
    ],
    ImageUploadedEvent::class => [
        ProcessImageListener::class,
    ],
];

6. 与其他模块的集成

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

6.1 与日志模块集成

日志模块可以监听文件事件,记录文件操作日志:

// 在日志模块的服务提供者中
protected $listen = [
    FileUploadedEvent::class => [
        LogFileUploadListener::class,
    ],
    FileDeletedEvent::class => [
        LogFileDeleteListener::class,
    ],
];

6.2 与图片处理模块集成

图片处理模块可以监听图片上传事件,自动处理图片:

// 在图片处理模块的服务提供者中
protected $listen = [
    ImageUploadedEvent::class => [
        ResizeImageListener::class,
        AddWatermarkListener::class,
    ],
];

6.3 与存储模块集成

存储模块可以监听文件删除事件,清理存储空间:

// 在存储模块的服务提供者中
protected $listen = [
    FileDeletedEvent::class => [
        CleanupStorageListener::class,
    ],
    ImageDeletedEvent::class => [
        CleanupStorageListener::class,
    ],
];