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