文件模块的事件系统用于在文件和图片的生命周期的关键节点触发事件,允许其他模块或系统组件响应这些事件并执行相应的操作。这种设计实现了模块间的松耦合,提高了系统的可扩展性和可维护性。
当新文件上传时触发。
事件类: App\Module\File\Events\FileUploadedEvent
事件数据:
/**
* 文件模型
* @var FileFile
*/
public FileFile $file;
触发时机:
当新图片上传时触发。
事件类: App\Module\File\Events\ImageUploadedEvent
事件数据:
/**
* 图片模型
* @var FileImg
*/
public FileImg $image;
触发时机:
当文件删除时触发。
事件类: App\Module\File\Events\FileDeletedEvent
事件数据:
/**
* 文件ID
* @var int
*/
public int $fileId;
/**
* 文件路径
* @var string
*/
public string $filePath;
/**
* 存储磁盘
* @var string
*/
public string $storageDisk;
触发时机:
当图片删除时触发。
事件类: App\Module\File\Events\ImageDeletedEvent
事件数据:
/**
* 图片ID
* @var int
*/
public int $imageId;
/**
* 图片路径
* @var string
*/
public string $imagePath;
/**
* 存储磁盘
* @var string
*/
public string $storageDisk;
触发时机:
监听文件相关事件,执行相应的操作。
监听器类: App\Module\File\Listeners\FileEventListener
职责:
文件模块通过服务提供者注册事件和监听器:
/**
* 文件模块服务提供者
*/
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,
];
// ...
}
// 上传文件后触发事件
$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));
// 在其他模块中监听文件事件
protected $listen = [
FileUploadedEvent::class => [
LogFileUploadListener::class,
],
ImageUploadedEvent::class => [
ProcessImageListener::class,
],
];
文件模块的事件系统可以与其他模块集成,实现跨模块功能:
日志模块可以监听文件事件,记录文件操作日志:
// 在日志模块的服务提供者中
protected $listen = [
FileUploadedEvent::class => [
LogFileUploadListener::class,
],
FileDeletedEvent::class => [
LogFileDeleteListener::class,
],
];
图片处理模块可以监听图片上传事件,自动处理图片:
// 在图片处理模块的服务提供者中
protected $listen = [
ImageUploadedEvent::class => [
ResizeImageListener::class,
AddWatermarkListener::class,
],
];
存储模块可以监听文件删除事件,清理存储空间:
// 在存储模块的服务提供者中
protected $listen = [
FileDeletedEvent::class => [
CleanupStorageListener::class,
],
ImageDeletedEvent::class => [
CleanupStorageListener::class,
],
];