yoelpc4 / laravel-media
Laravel 媒体管理器。
Requires
- php: >=7.2
- ext-fileinfo: *
- illuminate/contracts: 8.*|7.*|6.*
- illuminate/database: 8.*|7.*|6.*
- illuminate/http: 8.*|7.*|6.*
- illuminate/support: 8.*|7.*|6.*
- illuminate/validation: 8.*|7.*|6.*
- spatie/image: ^1.10.1
- spatie/temporary-directory: ^1.3.0
Requires (Dev)
- orchestra/testbench: 6.*|5.*|4.*
- phpunit/phpunit: 9.*|8.4.*|8.3.*
README
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 模型。
有关更多信息,请查看以下问题
- spatie/laravel-medialibrary#343
- spatie/laravel-medialibrary#1060
- spatie/laravel-medialibrary#1384
- spatie/laravel-medialibrary#1423
- spatie/laravel-medialibrary#1444
以及这里的拉取请求
文件来源
laravel-media 只允许您从磁盘路径和上传的文件添加文件。而 laravel-media 允许您从磁盘路径、远程文件、上传的文件、symfony 文件、临时上传、URL 和请求添加文件。
全面解决方案与狭窄解决方案
laravel-media 提供狭窄的解决方案,具有有限的功能以满足特定要求(验证异常、未保存的 mediable 模型以及简单的文件来源)。而 laravel-medialibrary 提供全面的解决方案,具有丰富的功能和经过实战测试。因此,在安装此包之前请仔细考虑。
许可
Laravel Media 是开源软件,许可协议为 MIT 许可协议。