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