SuperAPI AI 工具集

medialibrary-development

编程与开发

查看项目

更新于 10-16 01:57

技能介绍

用途

本技能用于在 Laravel 项目中使用 spatie/laravel-medialibrary 包,将文件关联到 Eloquent 模型,并围绕上传、转换与检索媒体开展开发工作。

主要能力

  • 将文件关联到 Eloquent 模型。
  • 支持图像与视频转换。
  • 支持响应式图片。
  • 支持多个媒体集合。
  • 支持多种存储磁盘。
  • 涵盖媒体上传、集合、转换、响应式图片、自定义属性、文件获取、路径与 URL 生成。

不涵盖:无 Eloquent 关联的通用文件存储、非 Laravel 框架。

使用方式

工作流程

  1. 识别任务类型(模型设置、添加媒体、定义转换、获取文件等)。
  2. 阅读 references/medialibrary-guide.md,聚焦相关章节。
  3. 应用参考中的模式,保持代码精简且符合 Laravel 原生风格。

模型设置

每个需要媒体的模型都必须实现 HasMedia 接口并使用 InteractsWithMedia trait:

use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class BlogPost extends Model implements HasMedia
{
    use InteractsWithMedia;
}

添加媒体

$blogPost->addMedia($file)->toMediaCollection('images');
$blogPost->addMediaFromUrl($url)->toMediaCollection('images');
$blogPost->addMediaFromRequest('file')->toMediaCollection('images');

定义集合

public function registerMediaCollections(): void
{
    $this->addMediaCollection('avatar')->singleFile();
    $this->addMediaCollection('downloads')->useDisk('s3');
}

定义转换

use Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\Image\Enums\Fit;

public function registerMediaConversions(?Media $media = null): void
{
    $this->addMediaConversion('thumb')
        ->fit(Fit::Contain, 300, 300)
        ->nonQueued();
}

获取媒体

$url = $model->getFirstMediaUrl('images');
$thumbUrl = $model->getFirstMediaUrl('images', 'thumb');
$allMedia = $model->getMedia('images');

建议做法

  • 始终同时实现 HasMedia 接口并使用 InteractsWithMedia trait。
  • registerMediaConversions() 的参数使用 ?Media $media = null。
  • 调用 ->toMediaCollection() 完成媒体添加。
  • 对需要同步运行的转换使用 ->nonQueued()。
  • 对只应保存一个文件的集合使用 ->singleFile()。
  • fit 方法使用 Spatie\Image\Enums\Fit 枚举值。

避免做法

  • 迁移前不要忘记运行:php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
  • 不要用 env() 配置磁盘,应使用 config() 或在 config/media-library.php 中设置。
  • 不要只调用 addMedia() 而不调用 toMediaCollection(),否则媒体不会被保存。
  • 不要引用未在 registerMediaConversions() 中注册的转换名称。

适用场景

当在 Laravel 中处理文件上传、媒体附件或图片处理时;当代码引用 HasMedia、InteractsWithMedia、Media 模型或媒体集合/转换时;当用户希望添加、获取、转换或管理附加到 Eloquent 模型的文件时。

限制

不适用于无 Eloquent 关联的通用文件存储,也不适用于非 Laravel 框架。