Laravel Nova + Spatie Медиатека - PullRequest
       11

Laravel Nova + Spatie Медиатека

0 голосов
/ 26 августа 2018

Попытка использовать Laravel Nova с Spatie Media Library. Я создал поле загрузки следующим образом:

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

Ответы [ 3 ]

0 голосов
/ 28 августа 2018
    Image::make('Logo')
        ->store(function (Request $request, $model) {
            $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
        return [];
        }),

Возможно, возвращение пустого массива не позволит nova сохранить имя.

0 голосов
/ 08 декабря 2018

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, либо любой пустой массив может достигнуть того же самого, но лично мне кажется более ясным сделать первое.

0 голосов
/ 28 августа 2018

Я нашел обходной путь, установив пустой мутатор на модель.В вашем случае это будет:

class Manufacturer extends Model implements HasMedia
{
    use HasMediaTrait;

    public function setLogoAttribute() {}

    //...
}

Вот пример всей моей реализации.Обратите внимание, что в настоящее время в Nova 1.0.6 метод preview() не работает, он возвращает thumbnail() url.

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

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);
        ];
    }
}
...