yoelpc4/laravel-media

Laravel 媒体管理器。

v0.3.0 2024-07-28 08:50 UTC

This package is auto-updated.

Last update: 2024-08-28 09:08:55 UTC


README

Packagist Downloads Build Code Coverage Software License Contributor Covenant

Laravel 媒体管理器。

需求

安装

使用composer命令安装此包

composer require yoelpc4/laravel-media

包发布

通过命令发布包配置

php artisan vendor:publish --provider="Yoelpc4\LaravelMedia\MediaServiceProvider" --tag=config

通过命令发布包迁移

php artisan vendor:publish --provider="Yoelpc4\LaravelMedia\MediaServiceProvider" --tag=migrations

通过命令发布包资源

php artisan vendor:publish --provider="Yoelpc4\LaravelMedia\MediaServiceProvider" --tag=resources

配置

图像优化器

默认情况下,所有添加到媒体中的图像将根据媒体配置中的 image_optimizers 进行优化。更多信息请访问 https://github.com/spatie/image-optimizer#optimization-tools

媒体模型

通过扩展 \Yoelpc4\LaravelMedia\Models\Media 来自定义媒体模型,然后在 model 选项上注册您的模型。

媒体观察者

通过扩展 \Yoelpc4\LaravelMedia\Observers\MediaObserver 来自定义媒体观察者,然后在 observer 选项上注册您的观察者。

版本化URL

通过设置 versioned_url 选项为 true,在查询参数上生成带有版本的媒体URL,例如:https:///storage/1/image.jpg?v=1610970549

可媒体模型

可媒体合同和 InteractsWithMedia 关注点

具有媒体的模型必须实现 \Yoelpc4\LaravelMedia\Contracts\Mediable 接口并使用 \Yoelpc4\LaravelMedia\Concerns\InteractsWithMedia 特性。

示例:在用户模型上使用带有 profileImage 关系的可媒体合同和 InteractsWithMedia 关注点

class User extends \Illuminate\Database\Eloquent\Model implements \Yoelpc4\LaravelMedia\Contracts\Mediable {
    use \Yoelpc4\LaravelMedia\Concerns\InteractsWithMedia;
    
    /**
     * User morph one profile image
     *
     * @return \Illuminate\Database\Eloquent\Relations\MorphOne
     */
    public function profileImage()
    {
        return $this->morphOne(\Yoelpc4\LaravelMedia\Models\Media::class, 'mediable')->whereGroup('profile image');
    }
}

媒体组注册

示例:在 Project 模型上注册媒体组

/**
 * @inheritDoc
 */
public function registerMediaGroups()
{
    $this->addMediaGroup('contract document')
        ->setMimeTypes('application/pdf')
        ->setMaxFileLimit(3);
}

媒体转换注册

示例:在用户模型上注册媒体组注册的媒体转换

/**
 * @inheritDoc
 */
public function registerMediaGroups()
{
    $this->addMediaGroup('profile image')
        ->setMimeTypes(['image/jpeg', 'image/png'])
        ->setMaxFileLimit(1)
        ->registerMediaConversions(function () {
            $this->addMediaConversion('square-thumb')
                ->width(160)
                ->height(160);
        });
}

媒体组

媒体组具有名称、MIME 类型、最大文件大小、最大文件限制和媒体转换注册属性。它由一个文件或多个文件组成。MIME 类型、最大文件大小和最大文件限制属性将在添加文件到媒体时用于验证。默认媒体组具有空数组 MIME 类型、2MB 最大文件大小和 null 最大文件限制。

如果媒体组具有最大文件限制(数据类型为整数,而非 null),则此包将保留最后一批最大文件限制文件,并删除其他文件。例如,User 模型具有 profile image 媒体组,最大文件限制为 1,并且我们在数据库中有一个用户 id 1,其 profile image 作为媒体 id 1。如果我们尝试上传用户 id 1 的 profile image,则媒体 id 1 和旧 profile image 将被删除,用户 id 1 将最终具有媒体 id 2 和新 profile image。

媒体转换

媒体转换具有名称、操作,并且应在媒体组属性上执行。它旨在处理具有文件类型图像的媒体。您可以在媒体转换注册上调用 \Spatie\Image\Manipulations 方法,因为它具有 __call 魔法方法,代理方法调用将被注册为其操作。

将媒体文件添加到可媒体模型

从路径添加媒体文件

示例:将存储路径上的媒体文件添加到数据库中的第一个用户模型

try {
$path = storage_path('avatar.jpg');

$media = User::first()->addFile($path)->toMediaGroup('profile image');
} catch (\Illuminate\Contracts\Filesystem\FileNotFoundException $e) {
    throw $e;
} catch (\Illuminate\Validation\ValidationException $e) {
    throw $e;
} catch (\Spatie\Image\Exceptions\InvalidImageDriver $e) {
    throw $e;
}

从上传的文件添加媒体文件

示例:将媒体文件从 \Illuminate\Http\UploadedFile 添加到未保存的项目模型

try {
$uploadedFile = request()->file('file');

$media = (new Project)->addFile($uploadedFile)->toMediaGroup('contract document');
} catch (\Illuminate\Contracts\Filesystem\FileNotFoundException $e) {
    throw $e;
} catch (\Illuminate\Validation\ValidationException $e) {
    throw $e;
} catch (\Spatie\Image\Exceptions\InvalidImageDriver $e) {
    throw $e;
}

媒体URL生成

获取媒体URL

示例:在媒体上获取媒体URL

$url = Media::first()->getMediaUrl();

获取媒体转换URL

在相关媒体上获取媒体转换URL的示例

$url = User::first()->profileImage->getMediaConversionUrl('square-thumb');

如果媒体没有指定的媒体转换名称,它将返回null。

spatie/laravel-medialibrary 的区别

媒体组与媒体集合

laravel-media 使用媒体组作为类似媒体类型的术语,而 laravel-medialibrary 使用媒体集合作为术语。

必选媒体组

laravel-media 要求您将文件添加到 mediable 模型上命名的媒体组。而 laravel-medialibrary 提供灵活性,可以省略媒体组名称,并将“默认”作为媒体组名称。

验证异常

laravel-media 总是执行基于注册的媒体组的 MIME 类型和大文件大小的验证,当验证不满足时,将抛出 \Illuminate\Validation\ValidationException。另一方面,laravel-medialibrary 抛出 \Spatie\MediaLibrary\MediaCollections\Exceptions\FileUnacceptableForCollection 而不是 \Illuminate\Validation\ValidationException

向未保存的 mediable 模型添加文件

laravel-media 允许您将媒体文件添加到未保存的 mediable 模型。而 laravel-medialibrary 预期每个媒体都必须附加到已保存的 mediable 模型。

有关更多信息,请查看以下问题

以及这里的拉取请求

文件来源

laravel-media 只允许您从磁盘路径和上传的文件添加文件。而 laravel-media 允许您从磁盘路径、远程文件、上传的文件、symfony 文件、临时上传、URL 和请求添加文件。

全面解决方案与狭窄解决方案

laravel-media 提供狭窄的解决方案,具有有限的功能以满足特定要求(验证异常、未保存的 mediable 模型以及简单的文件来源)。而 laravel-medialibrary 提供全面的解决方案,具有丰富的功能和经过实战测试。因此,在安装此包之前请仔细考虑。

许可

Laravel Media 是开源软件,许可协议为 MIT 许可协议