# Media

# Dyski

W module tym można zdefiniować dowolnie wiele dysków, które obsługiwane są przez pakiet thephpleague/flysystem (opens new window) oraz File Storage Laravela (opens new window). Tworząc nowy dysk należy dodać go do następujących configów:

  • config/filesystems.php

 
 
 
 
 
 


'disks' => [
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL') . '/storage',
        'visibility' => 'public',
    ],
],
  • Modules/Media/Config/config.php

 
 
 
 
 
 


'disks' => [
    [
        'name' => 'public',
        'is_active' => true,
        'visibility' => 'public',
        'is_default' => true
    ]
],

# Obsługa dysków prywatnych

Media umożliwiają stworzenie dysku prywatnego, należy w configu parametr visibility ustawić na private. Żeby pobrać/wyświetlić plik znajdujący się w takim dysku wymagane jest podanie parametru signature w query. Parametr ten zapisywany jest w bazie danych w tabeli media_files w kolumnie uuid podczas uploadu pliku.

TIP

Przykład użycia: http://api.mooncore.lh/api/media/c/{disk}/fp/{filePath}?signature=c101a3bd-0479-478e-a909-f2b3886d74d7

Przeczytaj więcej na temat pobierania/wyświetlania plików w rozdziale o przekształceniach na plikach.

Sprawdzenie czy sygnatura pasuje do pliku odbywa się w middleware Modules/Media/Http/Middleware/CheckFile.php.

# Katalogi

W każdym dysku można utworzyć dowolnie wiele katalogów. Dla uproszczenia działania modułu struktura katalogów nie znajduje się w bazie danych. Dozwolone są następujące działania na katalogach:

  • wyświetlenie drzewa,
  • tworzenie,
  • usuwanie,
  • przenoszenie razem z zawartością

# Pliki

Dane dotyczące pliku zapisywane są w bazie danych oraz dostępne są do edycji w panelu. Dozwolone są następujące działania na plikach:

  • upload,
  • przenoszenie do innego katalogu,
  • kopiowanie,
  • zmiana nazwy,
  • przekształcenia na plikach graficznych

# Wykrywanie mediów

Pliki widoczne w menedżerze plików to wpisy w bazie danych, które zawierają ścieżkę do fizycznego pliku na serwerze. Podczas uploadu pliku przez frontową aplikację, automatycznie dodawany jest taki wpis w bazie danych.

Jeśli na serwerze znajdują się pliki, które nie widnieją w menedżerze plików, można skorzystać z komendy artisana php artisan media:discover, która wykryje pliki i doda brakujące wpisy.

# Przekształcenia plików graficznych

W tym celu używany jest pakiet intervention/image (opens new window). Listę dostępnych funkcji można znaleźć w configu media.available_image_conversions.

Każde z tych przekształceń można wywołać na pliku graficznym poprzez api modułu, routing można sprawdzić w pliku Modules/Media/Http/Routes/conversions.php lub w dokumentacji api (Media conversion) (opens new window)

Uwaga

Plik utworzony na podstawie przekształcenia jest wczytywany z cache. Długość przechowywania informacji w cache definiowana jest w zmiennej środowiskowej MEDIA_CACHE_LIFETIME (podajemy w minutach), domyślnie jest to wartość ustawiona w configu:

'cache_lifetime' => env('MEDIA_CACHE_LIFETIME', 43200)

# Services

Wszystkie działania na dyskach, katalogach oraz plikach wykonywane są w Modules/Media/Services:

  • Storageable (klasa bazowa, która rozszerzana jest w poniższych serwisach),
  • DiskService,
  • DirectoryService,
  • FileService,
  • ConversionService

# Wstrzykiwanie zależności

W celu szybszego wykorzystywania powyższych serwisów został wykorzystany proces Binding w Service Container (opens new window). W momencie gdy wstrzykujemy klasę w konstruktorze lub dowolnej metodzie jako argument przekazywana jest nazwa dysku z requestu.

public function registerBindings()
{
    $this->app->bind(DiskService::class, function ($app) {
        return new DiskService($app->request->disk);
    });

    $this->app->bind(DirectoryService::class, function ($app) {
        return new DirectoryService($app->request->disk);
    });

    $this->app->bind(FileService::class, function ($app) {
        return new FileService($app->request->disk);
    });

    $this->app->bind(ConversionService::class, function ($app) {
        return new ConversionService($app->request->disk);
    });
}
namespace Modules\Media\Http\Controllers\Api;

use Modules\Core\Http\Controllers\Api\BaseController;
use Modules\Media\Services\ConversionService;

class ConversionController extends BaseController
{
    private $conversionService;

    public function __construct(ConversionService $conversionService)
    {
        $this->conversionService = $conversionService;
    }
}

TIP

Żeby użyć serwisu z innym dyskiem należy wykonać inicjalizacje ręcznie:

$conversionService = new ConversionService('private');

# Przypisywanie do modeli

Uwaga

Model musi implementować trait Modules\Media\Traits\HasFiles.


 



 


use Modules\Core\Models\BaseModel as Model;
use Modules\Media\Traits\HasFiles;

class Employee extends Model
{
    use HasFiles;
}

Podczas tworzenia/aktualizacji modelu należy wysłać media_files tak jak na poniższym przykładzie. W przypadku gdy chcemy stworzyć przekształcenie typu crop na pliku graficznym wysyłamy również coordinates. W celu ujednolicenia typu danych wysyłamy medium zawsze jako typ array.

{
    "media_files": {
        "avatar": [
            {
                "id": 6,
                "coordinates": {
                    "width": 400,
                    "height": 400,
                    "x": 651,
                    "y": 43
                }
            }
        ]
    }
}

Uwaga

Aby media_files pojawiły się w odpowiedzi serwera, należy wczytać relację files.translation.

Alternatywnie można skorzystać z metody $model->loadFiles();, która jest zdefiniowana w trait Modules\Media\Traits\HasFiles.

Przypisane pliki zwracamy w Resource w następujący sposób:


 
 



 







 





use Illuminate\Http\Resources\Json\JsonResource;
use Modules\Media\Http\Transformers\FileResource;
use Modules\Media\Traits\HasLoadedFiles;

class EmployeeResource extends JsonResource
{
    use HasLoadedFiles;

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'media_files' => $this->loadedFiles(),
            'created_at' => $this->format_created_at,
        ];
    }
}