Spatie/Laravel-MediaLibrary v10:能否动态添加媒体转换?
在spatie/laravel-medialibrary v10中动态添加媒体转换的可行方案
你直接赋值$this->mediaConversions的方式会被忽略,因为模型的媒体转换是通过registerMediaConversions方法注册的,直接修改该属性不会触发转换的注册逻辑。以下是两种可行的实现方式:
方法一:链式调用添加单个转换
直接在addMedia的链式调用中使用addMediaConversion方法逐个添加转换:
use Spatie\MediaLibrary\Conversions\Conversion; $this->addMedia($filePath) ->addMediaConversion('name') ->withResponsiveImages() ->performOnCollections('default') ->format('webp') ->addMediaConversion('another-one') ->withResponsiveImages() ->performOnCollections('default') ->format('webp') ->toMediaCollection();
方法二:批量添加转换(接近你期望的用法)
先定义转换数组,通过循环批量添加到媒体上传实例中:
use Spatie\MediaLibrary\Conversions\Conversion; $conversions = [ Conversion::create('name') ->withResponsiveImages() ->performOnCollections('default') ->format('webp'), Conversion::create('another-one') ->withResponsiveImages() ->performOnCollections('default') ->format('webp'), ]; $mediaUploader = $this->addMedia($filePath); foreach ($conversions as $conversion) { $mediaUploader->addMediaConversion($conversion); } $mediaUploader->toMediaCollection();
自定义封装(实现类似withConversions的用法)
如果需要频繁使用批量添加转换的逻辑,可以在模型中封装一个自定义方法:
use Spatie\MediaLibrary\Conversions\Conversion; // 模型内的自定义方法 public function addMediaWithConversions(string $path, array $conversions) { $mediaUploader = $this->addMedia($path); foreach ($conversions as $conversion) { $mediaUploader->addMediaConversion($conversion); } return $mediaUploader; }
使用时就可以像你期望的那样调用:
$this->addMediaWithConversions($filePath, [ Conversion::create('another-one') ->withResponsiveImages() ->performOnCollections('default') ->format('webp'), ])->toMediaCollection();
内容的提问来源于stack exchange,提问作者ondroftw
相关产品推荐
相关产品推荐

