genesisweb / media
Requires
- php: ^7.3|^8.0
- intervention/image: ^2.5|^3.2
- laravel/framework: ~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0
Requires (Dev)
- laravel/legacy-factories: ^1.0.4|^1.2|^1.3
- mockery/mockery: ^1.2.3|^1.6
- orchestra/testbench: ~3.8.6|^4.8|^5.2|^6.0|^7.0|^8.0
README
将文件附加到您的eloquent模型上的简单解决方案,内置图像处理功能!
安装
您可以通过composer安装此包
composer require genesisweb/media
安装完成后,您应该发布提供的资源以创建必要的迁移和配置文件。
php artisan vendor:publish --provider="GenesisWeb\Media\MediaServiceProvider"
关键概念
在继续之前,您应该了解一些关键概念
-
媒体可以是任何类型的文件,从jpeg到zip文件。在尝试上传文件之前,您应该在应用程序的验证逻辑中指定任何文件限制。
-
媒体作为自己的实体上传。在创建时,它不属于系统中的另一个模型,因此项目可以独立管理(这使得它成为媒体管理器的完美引擎)。
-
媒体必须附加到模型才能建立关联。
-
媒体项绑定到“组”。这使得将多种类型的媒体关联到模型变得容易。例如,一个模型可能有一个“images”组和“documents”组。
-
您可以使用转换来操作图像。您可以在媒体项与模型关联时指定要执行的转换。例如,您可以在图像附加到模型的“gallery”组时注册一个“缩略图”转换。
-
转换是全局注册的。这意味着它们可以在您的应用程序中重复使用,即Post和User可以具有相同大小的缩略图,而无需两次注册相同的转换。
使用方法
上传媒体
您应该使用 GenesisWeb\Media\MediaUploader
类来处理文件上传。
默认情况下,此类将文件更新到媒体配置中指定的磁盘。它将它们保存为原始文件名的净化版本,并在数据库中创建一个包含文件详细信息的媒体记录。
您还可以在上传之前自定义文件的一些属性。
$file = $request->file('file'); // Default usage $media = MediaUploader::fromFile($file)->upload(); // Custom usage $media = MediaUploader::fromFile($file) ->useFileName('custom-file-name.jpeg') ->useName('Custom media name') ->upload();
将媒体与模型关联
为了将媒体项与模型关联,您必须首先包含 GenesisWeb\Media\HasMedia
特性。
class Post extends Model { use HasMedia; }
此特性将设置您的模型与媒体模型之间的关系。其主要目的是提供用于附加和检索媒体的流畅API。
包含后,您可以根据下面的示例将媒体附加到模型。附加媒体方法的第一个参数可以是媒体模型实例、id或模型/ids的可迭代列表。
$post = Post::first(); // To the default group $post->attachMedia($media); // To a custom group $post->attachMedia($media, 'custom-group');
从模型解除媒体关联
为了从模型解除媒体关联,您应该调用提供的 detachMedia
方法。
// Detach all the media $post->detachMedia(); // Detach the specified media $post->detachMedia($media); // Detach all the media in a group $post->clearMediaGroup('your-group');
如果您想删除媒体项,您应该以与应用程序中任何其他模型相同的方式执行。
Media::first()->delete();
这样做将从文件系统中删除文件,并删除媒体项与您的应用程序模型之间的任何关联。
检索媒体
HasMedia
特性的另一个功能是能够检索媒体。
// All media in the default group $post->getMedia(); // All media in a custom group $post->getMedia('custom-group'); // First media item in the default group $post->getFirstMedia(); // First media item in a custom group $post->getFirstMedia('custom-group');
除了检索媒体项外,您还可以直接从您的模型中检索媒体模型的属性。
// Url of the first media item in the default group $post->getFirstMediaUrl(); // Url of the first media item in a custom group $post->getFirstMediaUrl('custom-group');
操作图像
此包提供了一种流畅的API来操作图像。您可以在媒体附加到组时指定要执行的“转换”。它底层使用熟悉的 intervention/image
库,因此可以使用库提供的所有选项来操作图像。
要开始使用,您应该首先在应用程序的一个服务提供者中注册一个转换
use Intervention\Image\Image; use GenesisWeb\Media\Facades\Conversion; class AppServiceProvider extends ServiceProvider { public function boot() { Conversion::register('thumb', function (Image $image) { return $image->fit(64, 64); }); } }
注册转换后,您应该配置一个媒体组,以便在媒体附加到您的模型时执行转换。
class Post extends Model { use HasMedia; public function registerMediaGroups() { $this->addMediaGroup('gallery') ->performConversions('thumb'); } }
现在,当媒体项目被附加到“相册”组时,将生成一个转换后的图像。您可以通过以下示例获取转换后图像的URL
// The thumbnail of the first image in the gallery group $post->getFirstMediaUrl('gallery', 'thumb');
为什么使用这个包?
已经存在一些包可以解决与这个包旨在解决的问题类似的问题。
其中最流行的是
这个包与上面列出的包之间有几个关键区别。我们的包是为了支持媒体管理器,并使图像操作变得容易。以下比较表可以更好地说明这一点
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。