optix / media-manager
Requires
- php: ^7.3
- intervention/image: ^2.5
- laravel/framework: ~5.8.0|^6.0|^7.0|^8.0
Requires (Dev)
- laravel/legacy-factories: ^1.0.4
- mockery/mockery: ^1.2.3
- orchestra/testbench: ~3.8.6|^4.8|^5.2|^6.0
README
一个简单的解决方案,可以将文件附加到eloquent模型上,并内置了图像处理功能!
安装
您可以通过composer安装此包
composer require optix/media
安装完成后,您应该发布提供的资产以创建必要的迁移和配置文件。
php artisan vendor:publish --provider="Optix\Media\MediaServiceProvider"
关键概念
在继续之前,您应该理解以下几个关键概念
-
媒体可以是任何类型的文件,从jpeg到zip文件。在尝试上传文件之前,您应该在应用程序的验证逻辑中指定任何文件限制。
-
媒体作为自己的实体上传。在创建时,它不属于系统中的其他模型,因此项目可以独立管理(这使得它成为媒体管理器的完美引擎)。
-
媒体必须附加到模型才能建立关联。
-
媒体项绑定到“组”。这使得将多种类型的媒体关联到模型变得容易。例如,一个模型可能有一个“images”组和“documents”组。
-
您可以使用转换来处理图像。您可以在媒体项关联到模型时指定要执行的转换。例如,您可以为模型“gallery”组中的图像附加“缩略图”转换。
-
转换是全局注册的。这意味着它们可以在您的应用程序中重复使用,即Post和User可以拥有相同大小的缩略图,而无需注册两次相同的转换。
用法
上传媒体
您应该使用Optix\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();
将媒体与模型关联
为了将媒体项与模型关联,您必须首先包含Optix\Media\HasMedia
特性。
class Post extends Model { use HasMedia; }
此特性将设置您的模型和媒体模型之间的关系。其主要目的是提供用于附加和检索媒体的流畅API。
一旦包含,您就可以像下面演示的那样将媒体附加到模型上。关联媒体方法的第一个参数可以是媒体模型实例、ID或模型/ID的可迭代列表。
$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 Optix\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)。有关更多信息,请参阅许可证文件。