Централизованная медиатека для управления всеми файлами сайта bozheslav.ru — изображениями, документами, превью портфолио. Интегрирована в админку Filament.
— Для foreign-key-like полей используются slug-строки, а не integer ID — избегает PostgreSQL ошибки bigint = character varying при джойнах
— Nginx location ^~ /portfolio/ с правильным try_files — решает классический конфликт статики и Laravel-роутов
Стек: PHP 8.3, Laravel 12, Filament 3, Filament Curator, Intervention Image (Imagick), Glide, PostgreSQL 16, Nginx.
— Загрузка изображений с автоматической оптимизацией через Intervention Image (Imagick driver)
— Копируемые URL через TextColumn->copyable() в Filament — клик на значок копирования, и URL в буфере (найденное решение, т.к. стандартный Action не работает для этой задачи)
— Захват метаданных через хук afterCreate(): размеры, тип, размер файла — в более ранних хуках файл ещё в tmp/ и данные недоступны
— Универсальная структура: одна медиатека на весь сайт (блог, портфолио, страницы) с возможностью фильтрации по использованию
— Glide integration для on-the-fly ресайза и кэширования версий изображений
— Защита от nginx-конфликтов: специально добавлен try_files в location-блок, чтобы статические пути не перехватывали динамические Glide-роуты (/curator/{path})