Файлы, изображения
File
Поле предназначено для загрузки файлов. Добавьте его в метод fields() вашего ресурса:
use Frame\Laravel\Fields\File;
public function fields(): array
{
return [
File::make('documents'),
];
}

Ограничение количества
Метод maximum() задаёт максимальное количество загружаемых файлов:
File::make('documents')
->maximum(5)
Множественная загрузка
Метод multiple() включает режим множественной загрузки:
File::make('attachments')
->multiple()
->maximum(10)
Допустимые форматы
Через withMeta() можно ограничить допустимые форматы файлов:
File::make('videos')
->maximum(5)
->withMeta([
'accept' => 'video/mp4',
])
Image
Поле Image расширяет File и предназначено для работы с изображениями. По умолчанию принимает форматы: jpeg, png, svg, webp.
use Frame\Laravel\Fields\Image;
public function fields(): array
{
return [
Image::make('avatar'),
];
}
maximum(1) поле отображается в таблице (index). При maximum(>1) — автоматически скрывается из таблицы.Image::make('avatar')
->maximum(1)
Image::make('photos')
->multiple()
->maximum(10)
Конверсии
Метод conversion() указывает, какую конверсию изображения использовать при отображении. Название конверсии передаётся в медиа-драйвер, который решает, как её обработать:
Image::make('avatar')
->conversion('thumbnail')
Медиа-драйверы
Загрузка, получение, удаление и привязка файлов выполняется через медиа-драйвер — класс, реализующий контракт MediaDriver.
FileDriver, который хранит файлы через Laravel Storage и сохраняет метаданные в JSON-колонке модели. Дополнительных зависимостей не требуется.Контракт MediaDriver
Каждый драйвер реализует пять методов:
UploadedFile, возвращает массив метаданных для фронтенда.conversion).Полный интерфейс контракта:
use Frame\Core\Contracts\MediaDriver;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\UploadedFile;
interface MediaDriver
{
public function upload(UploadedFile $file): array;
public function delete(int|string $id): void;
public function resolve(Model $model, string $field, array $options = []): ?array;
public function fill(Model $model, string $field, ?array $value): void;
public function export(Model $model, string $field): ?string;
}
Глобальный драйвер
По умолчанию все поля File и Image используют FileDriver. Чтобы заменить драйвер глобально, вызовите useMediaDriver() в сервис-провайдере:
use Frame\Core\Frame;
use App\Drivers\SpatieMediaDriver;
public function boot(): void
{
Frame::useMediaDriver(SpatieMediaDriver::class);
}
После этого все файловые поля будут работать через указанный драйвер.
Драйвер на уровне поля
Метод driver() позволяет задать драйвер для конкретного поля. Драйвер поля имеет приоритет над глобальным:
use App\Drivers\CloudinaryDriver;
use App\Drivers\SpatieMediaDriver;
public function fields(): array
{
return [
// Аватар через Spatie Media Library
Image::make('avatar')
->driver(new SpatieMediaDriver()),
// Документы через Cloudinary
File::make('documents')
->driver(new CloudinaryDriver()),
];
}
JSON-режим
->json()), всегда используется встроенный FileDriver — независимо от глобального или per-field драйвера. Это гарантирует корректную работу с JSON-колонками.File::make('metadata->files')
->json()
FileDriver (по умолчанию)
FileDriver — встроенный драйвер, не требующий дополнительных пакетов:
- Загружает файлы через Laravel Storage (диск
public, директорияframe-uploads) - Хранит метаданные в JSON-колонке модели
- Поддерживает любые типы файлов
При необходимости можно настроить диск и директорию через сервис-контейнер:
use Frame\Laravel\Drivers\FileDriver;
public function register(): void
{
$this->app->when(FileDriver::class)
->needs('$disk')
->give('s3');
$this->app->when(FileDriver::class)
->needs('$directory')
->give('uploads');
}
Создание своего драйвера
Для интеграции с любым сервисом хранения создайте класс, реализующий контракт MediaDriver:
Создайте класс драйвера
namespace App\Drivers;
use Frame\Core\Contracts\MediaDriver;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\UploadedFile;
class SpatieMediaDriver implements MediaDriver
{
public function upload(UploadedFile $file): array
{
// Загрузка через Spatie Media Library
// Оптимизация, создание превью и т.д.
}
public function delete(int|string $id): void
{
// Удаление медиа по ID
}
public function resolve(Model $model, string $field, array $options = []): ?array
{
$conversion = $options['conversion'] ?? '';
// Получение медиа из коллекции модели
}
public function fill(Model $model, string $field, ?array $value): void
{
// Привязка медиа к модели: reorder, copy, удаление неиспользуемых
}
public function export(Model $model, string $field): ?string
{
// Экспорт путей через запятую
}
}
Зарегистрируйте драйвер
use Frame\Core\Frame;
use App\Drivers\SpatieMediaDriver;
public function boot(): void
{
Frame::useMediaDriver(SpatieMediaDriver::class);
}
$options в методе resolve() может содержать ключ conversion — название конверсии, переданное из Image::conversion().Структура ответа upload
Метод upload() должен возвращать массив с метаданными загруженного файла. Фронтенд ожидает следующую структуру:
public function upload(UploadedFile $file): array
{
return [
'id' => 'unique-id', // Уникальный идентификатор
'path' => 'https://.../', // Полный URL к файлу
'size' => 102400, // Размер в байтах
'name' => 'document.pdf', // Оригинальное имя файла
'type' => 'file', // 'file' или 'image'
'preview' => null, // Превью (thumbhash, base64 и т.д.)
'extension' => 'pdf', // Расширение файла
'collection' => 'default', // Название коллекции
'conversions' => [], // Доступные конверсии
'properties' => [], // Дополнительные свойства
'order' => 0, // Порядок сортировки
];
}