首页 > 解决方案 > Laravel Nova + Spatie 媒体库

问题描述

尝试将 Laravel Nova 与 Spatie 媒体库一起使用。我创建了这样的上传字段:

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

接缝正常,但 Nova 仍在尝试将文件名保存到制造商表中的“徽标”列。

自定义此字段的原始示例是:

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

标签: laravellaravel-5laravel-novalaravel-medialibrary

解决方案


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

class Manufacturer extends Model implements HasMedia
{
    use HasMediaTrait;

    public function setLogoAttribute() {}

    //...
}

这是我的整个实现的一个例子。请注意,目前使用 Nova 1.0.6,该preview()方法不起作用,它正在返回thumbnail()url。

应用程序/图库项目

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();
    }
}

App/Nova/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);
        ];
    }
}

推荐阅读