akkurateio / laravel-media
Laravel应用程序的媒体包
v0.1.1
2021-01-12 11:35 UTC
Requires
- akkurateio/laravel-back-components: ^0.1
- akkurateio/laravel-core: ^0.1
- akkurateio/laravel-search: ^0.1
- intervention/image: ^2.5
- laravel/legacy-factories: ^1.1
- spatie/laravel-medialibrary: ^8.3.0
- spatie/laravel-permission: ^3.0
- spatie/laravel-tags: ^2.6.2
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
README
Akkurate生态系统中的媒体管理模块。
该包的目标是扩展spatie/laravel-medialibrary包,特别是允许在不立即将其附加到模型的情况下导入媒体,或者相反,将相同的媒体附加到多个模型(例如,用于展示博客文章并可能用于轮播图或作为账户或用户的头像的图片)。
安装(该包已通过subvitamine/akkurate-laravel-boilerplate预装)
composer require akkurate/laravel-media
发布配置文件
php artisan vendor:publish --provider="Akkurate\LaravelMedia\LaravelMediaServiceProvider" --tag="config"
php artisan migrate
php artisan media:seed
为了管理标签,请确保在.env文件中正确设置了语言环境
APP_LOCALE=fr
概念
Media表和模型未更改,但Media不再直接与应用程序的模型相关联,而是与一个通用的Resource模型相关联。
任何需要与媒体关联的模型都必须使用HasResources特质。
use Akkurate\LaravelMedia\Traits\HasResources;
class Model
{
use HasResources;
}
资源扩展媒体,添加关联计数、用户、替代文本和图注。
使用的Media模型是Akkurate\LaravelMedia\Models\Media的自定义模型,该模型扩展了Spatie的Media模型。此自定义模型在v1中不添加任何方法或关系,但从长远来看,它将允许在不修改结构和配置的情况下添加这些功能。
一个pivot model_resource表允许将相同的资源分配给多个模型,无论它们是什么。
配置
每个资源都注册了某些标准转换,可以在项目配置文件中启用,而不是为每个模型单独启用。
'conversions' => [
'thumb' => true,
'preview' => true,
'square' => true,
'4:3' => true,
'16:9' => true,
],
媒体注册
在创建媒体之前,先创建资源
$resource = Resource::create([
'name' => $request->alt,
'user_id' => auth()->user()->id,
'account_id' => auth()->user()->account_id,
]);
资源创建后,将其与媒体关联
$resource->addMedia($file)
资源可以随后附加到任何模型
$user = User::find(1);
$user->resources()->attach($resource, ['legend' => 'Image pour l’utilisateur 1']);
$account = Account::find(1);
$account->resources()->attach($resource, ['legend' => 'Image pour le compte 2']);
由于相同的媒体可能有多种用途,可以在关系级别定义一个“图注”字段。
媒体使用
从模型中检索关联的媒体需要额外步骤(通过media_model_resource pivot表)。
$model->resources->first()->getFirstMedia()
有方法可以简化常见调用
$model->getLastResource() // = $model->resources->last();
$model->getLastResourceMedia() // = $model->resources->last()->getFirstMedia();
$model->getLastResourceMediaUrl() // = $model->resources->last()->getFirstMediaUrl();
$model->getPreview() // = $model->resources->last()->getFirstMediaUrl('default', 'preview');
$model->getSquare() // = $model->resources->last()->getFirstMediaUrl('default', 'square');
$model->get4_3() // = $model->resources->last()->getFirstMediaUrl('default', '4:3');
单个资源模型管理
在编辑视图中
@component('back::atomicdesign.atoms.has-media', ['object' => $model, 'form' => $form, 'resource' => $model->getLastResource()])@endcomponent
具有多个资源的模型管理
在编辑视图中
@component('back::atomicdesign.atoms.has-media', ['multiple' => true, 'object' => $model, 'form' => $form, 'resource' => $model->resources])@endcomponent
在控制器方法的edit中,更新后
$model->syncResources($request);
API
媒体
GET /media/medias?include=resource POST /media/medias // params: *image, *name, alt, legend GET /media/medias/{id} PUT,PATCH /media/medias/{id} // params: *name, alt, legend DELETE /media/medias/{id}
资源
GET /media/resources?include=media,tags&filter[tags]=tag1,tag3 // la resource ne remonte que si les deux tags sont attachés GET /media/resources/{id} // Attacher une resource à n’importe quel model POST /media/resources/{id}/attach // params: *model_type, *model_id // Supprimer une association resource/model POST /media/resources/{id}/detach // params: *model_type, *model_id // Gestion des tags sur les resources POST /media/resources/{id}/tags/attach // params: *tag POST /media/resources/{id}/tags/detach // params: *tag