首页 文章

Laravel Nova Spatie媒体库

提问于
浏览
2

尝试将Laravel Nova与Spatie Media Library一起使用 . 我创建了上传字段,如下所示:

Image::make('Logo')
        ->store(function (Request $request, $model) {
            $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
        }),

接缝没问题,但Nova仍然试图将文件名保存到制造商表中的“logo”列 .

用于自定义此字段的原始示例为:

File::make('Attachment')
    ->store(function (Request $request, $model) {
        return [
            'attachment' => $request->attachment->store('/', 's3'),
            'attachment_name' => $request->attachment->getClientOriginalName(),
            'attachment_size' => $request->attachment->getSize(),
        ];
    })

3 回答

  • 1

    我通过在模型上设置一个空的mutator找到了一个解决方法 . 在你的情况下,它将是:

    class Manufacturer extends Model implements HasMedia
    {
        use HasMediaTrait;
    
        public function setLogoAttribute() {}
    
        //...
    }
    

    这是我整个实现的一个例子 . 请注意,目前使用Nova 1.0.6时, preview() 方法无效,它将返回 thumbnail() url .

    应用/ GalleryItem

    class GalleryItem extends Model implements HasMedia
    {
        use HasMediaTrait;
    
        public function setImageAttribute() {}
    
        public function registerMediaConversions(Media $media = null)
        {
            $this->addMediaConversion('thumbnail')
                ->fit(Manipulations::FIT_CROP, 64, 64);
    
            $this->addMediaConversion('preview')
                ->fit(Manipulations::FIT_CROP, 636, 424);
    
            $this->addMediaConversion('large')
                ->fit(Manipulations::FIT_CONTAIN, 1920, 1080)
                ->withResponsiveImages();
        }
    
        public function registerMediaCollections()
        {
            $this->addMediaCollection('images')->singleFile();
        }
    }
    

    应用/诺瓦/ GalleryItem

    class GalleryItem extends Resource
    {
        public static $model = 'App\GalleryItem';
    
        public static $with = ['media'];
    
        public function fields(Request $request)
        {
            return [
                Image::make('Image')
                    ->store(function (Request $request, $model) {
                        $model->addMediaFromRequest('image')->toMediaCollection('images');
                    })
                    ->preview(function () {
                        return $this->getFirstMediaUrl('images', 'preview');
                    })
                    ->thumbnail(function () {
                        return $this->getFirstMediaUrl('images', 'thumbnail');
                    })
                    ->deletable(false);
            ];
        }
    }
    
  • 0
    Image::make('Logo')
            ->store(function (Request $request, $model) {
                $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
            return [];
            }),
    

    也许返回一个空数组阻止nova保存名称 .

  • 1

    Nova允许您从回调中返回 true 以指示处理已完成且不应自行设置任何属性 .

    这是运行回调的代码:

    protected function fillAttribute(NovaRequest $request, $requestAttribute, $model, $attribute)
    {
        //...
    
        $result = call_user_func($this->storageCallback, $request, $model);
    
        if ($result === true) {
            return;
        }
    
        if (! is_array($result)) {
            return $model->{$attribute} = $result;
        }
    
        foreach ($result as $key => $value) {
            $model->{$key} = $value;
        }
    }
    

    所以无论是 true 还是任何空阵列都会达到同样的效果,但是前人对此感觉更清楚 .

相关问题