File

Для прикрепления файла к ресурсу используется библиотека spatie/laravel-medialibrary.

Регистрация медиа-коллекции в модели.

app/Models/Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class Post extends Model implements HasMedia
{
    use HasFactory;
    use InteractsWithMedia;

    public function registerMediaCollections(): void
    {
        // Коллекция для файла
        $this->addMediaCollection('file')->singleFile();
    }
}

В livewire компоненте нужно подключить трейт HasMedia и добавить новое публичное свойство, которое совпадает с названием медиа-коллекции в модели.

app/Http/Livewire/Admin/Posts/PostItem.php
<?php

namespace App\Http\Livewire\Admin\Posts;

use App\Models\Post;
use WebVovan\RockCms\Http\Livewire\ResourceComponent;
use WebVovan\RockCms\Rules\FileMedia;
use WebVovan\RockCms\Traits\Livewire\HasMedia;

class PostItem extends ResourceComponent
{
    use HasMedia;

    ...

    // Поле для изображения
    public $file;

    // Правила валидации полей
    public function rules()
    {
        return [
            'file' => new FileMedia(),
        ];
    }

    /**
     * Вызывается один раз при инициализации компонента
     */
    public function init()
    {
        ...

        // Инициализация свойства с файлом
        $this->file = $this->resource->getFirstMedia('file');
    }

    /**
     * Вызывается при сохранении ресурса
     */
    public function save()
    {
        ...

        // Сохранение файла
        $this->saveSingleMedia($this->resource, $this->file, 'file');

    }
    
    ...
}

Для загрузки доступны форматы, перечисленные в config/livewire.php

'temporary_file_upload' => [
    'disk' => null,        // Example: 'local', 's3'              Default: 'default'
    'rules' => null,       // Example: ['file', 'mimes:png,jpg']  Default: ['required', 'file', 'max:12288'] (12MB)
    'directory' => null,   // Example: 'tmp'                      Default  'livewire-tmp'
    'middleware' => null,  // Example: 'throttle:5,1'             Default: 'throttle:60,1'
    'preview_mimes' => [   // Supported file types for temporary pre-signed file URLs.
        'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', 'pdf',
        'mov', 'avi', 'wmv', 'mp3', 'm4a',
        'jpg', 'jpeg', 'mpga', 'webp', 'wma',
    ],
    'max_upload_time' => 5, // Max duration (in minutes) before an upload gets invalidated.
],

Вывод поля:

<x-rock-cms::fields.single-file :model="$file" field="file" title="Файл"/>

Опции:

  • readonly - только для чтения

Last updated