medialibrary-helper/src/MediaData.php

69 lines
1.9 KiB
PHP

<?php
namespace Zoomyboy\MedialibraryHelper;
use Illuminate\Support\Facades\Storage;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Mappers\SnakeCaseMapper;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\MediaCollections\MediaCollection;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[MapInputName(SnakeCaseMapper::class)]
#[MapOutputName(SnakeCaseMapper::class)]
class MediaData extends Data
{
public ?int $id;
public string $originalUrl;
public int $size;
public string $name;
public string $collectionName;
public string $fileName;
#[MapInputName('custom_properties')]
public array $properties;
public array $conversions = [];
public bool $fallback = false;
public static function fromMedia(Media $media): self
{
$conversions = collect($media->getMediaConversionNames())->flip()->map(fn ($integer, $conversion) => [
'original_url' => $media->getFullUrl($conversion),
]);
return self::withoutMagicalCreationFrom([
...$media->toArray(),
'conversions' => $conversions->toArray(),
]);
}
public static function defaultFromCollection(HasMedia $parent, MediaCollection $collection): ?self
{
$default = $collection->runCallback('withFallback', $parent);
if (is_null($default)) {
return null;
}
return static::from([
'id' => null,
'originalUrl' => Storage::disk($default[1])->url($default[0]),
'size' => -1,
'collection_name' => $collection->name,
'name' => pathinfo($default[0], PATHINFO_FILENAME),
'file_name' => pathinfo($default[0], PATHINFO_BASENAME),
'properties' => [],
'fallback' => true,
]);
}
}