yurizoom / moonshine-media-manager
Media manager for MoonShine
Package info
github.com/yurizoom/moonshine-media-manager
pkg:composer/yurizoom/moonshine-media-manager
Requires
- php: ^8.2
- moonshine/moonshine: ^4.0
Conflicts
- moonshine/moonshine: <4.0
README
Файловый менеджер для MoonShine.
Поддержка версий
| MoonShine | Пакет | Документация |
|---|---|---|
| 4.0+ | 4.x | Ниже ↓ |
| 4.0+ | 3.x | Ниже ↓ |
| 3.0+ | 2.x | |
| 2.0+ | 1.x |
Скриншоты
| Менеджер | Пикер |
![]() |
![]() |
Установка
composer require yurizoom/moonshine-media-manager
Настройка v4 (MoonShine 4+)
Полностью AJAX — загрузка, удаление, переименование, навигация по папкам без перезагрузки страницы.
После установки опубликуйте ассеты:
php artisan vendor:publish --tag=moonshine-media-manager-assets
Конфигурация
Добавьте в config/moonshine.php:
'media_manager' => [ 'auto_menu' => true, 'disk' => config('filesystem.default', 'public'), 'allowed_ext' => 'jpg,jpeg,png,gif,webp,avif,svg,pdf,doc,docx,xls,xlsx,ppt,pptx,zip,rar,txt,mp3,mp4,wav,avi,mov', 'max_file_size' => env('MOONSHINE_MEDIA_MANAGER_MAX_FILE_SIZE', 50 * 1024 * 1024), 'default_view' => 'table', ],
Подключение OffCanvas
В app/MoonShine/Layouts/MoonShineLayout.php:
use YuriZoom\MoonShineMediaManager\Components\MediaManagerOffCanvas; final class MoonShineLayout extends AppLayout { protected function getContentComponents(): array { return [ ...parent::getContentComponents(), MediaManagerOffCanvas::make(), ]; } }
MediaManagerOffCanvas — глобальный компонент, рендерит offcanvas-панель с файловым менеджером. Именно через неё работают все picker-поля на страницах. Assets загружаются автоматически через компонент.
Добавление в меню (опционально)
Если auto_menu включён (по умолчанию), пункт появится автоматически. Для ручного размещения:
use YuriZoom\MoonShineMediaManager\Pages\MediaManagerPage; protected function menu(): array { return [ MenuItem::make(MediaManagerPage::class), ]; }
Поле MediaManagerPicker
Поле для выбора файлов из менеджера прямо в форме. Работает с обычными полями, Json и Layouts.
Базовое использование:
use YuriZoom\MoonShineMediaManager\Fields\MediaManagerPicker; // Одно изображение MediaManagerPicker::make('Изображение', 'image') ->allowedTypes(['image']), // Множественный выбор с перетаскиванием MediaManagerPicker::make('Галерея', 'images') ->multiple() ->allowedTypes(['image']),
Фильтрация файлов — по типу или по расширению, можно комбинировать:
// По типу (из менеджера): image, video, audio, pdf, word, code, zip, txt, ppt ->allowedTypes(['image']) ->allowedTypes(['image', 'pdf']) // По расширению (точный контроль): ->allowedExtensions(['jpg', 'png', 'webp']) ->allowedExtensions(['pdf', 'doc', 'docx', 'xls', 'xlsx'])
С Json:
use MoonShine\UI\Fields\Json; Json::make('Мета', 'meta') ->fields([ Text::make('Заголовок', 'title'), MediaManagerPicker::make('Изображение', 'image') ->allowedTypes(['image']), MediaManagerPicker::make('Документ', 'document') ->allowedExtensions(['pdf', 'doc', 'docx']), MediaManagerPicker::make('Файлы', 'files') ->multiple() ->allowedExtensions(['pdf', 'doc', 'docx', 'xls', 'xlsx']), ]),
С Layouts:
use MoonShine\Layouts\Fields\Layouts; Layouts::make('Контент', 'content') ->addLayout('Блок с изображением', 'image_block', [ Text::make('Заголовок', 'title'), MediaManagerPicker::make('Изображение', 'image') ->allowedTypes(['image']), ]) ->addLayout('Файловый блок', 'files_block', [ Text::make('Заголовок', 'title'), MediaManagerPicker::make('Документы', 'documents') ->multiple() ->allowedExtensions(['pdf', 'doc', 'docx', 'xls', 'xlsx']), ]),
Возможности v4
- AJAX навигация — переход по папкам без перезагрузки
- Загрузка файлов — множественная загрузка с проверкой MIME-типа, расширения и размера файла
- Создание папок — прямо из интерфейса
- Переименование / перемещение — через модалку с указанием нового пути
- Удаление — с подтверждением
- Скачивание — по клику
- URL файла — просмотр ссылки с копированием
- Два вида — таблица и сетка (grid)
- Быстрый переход — ввод пути вручную
- Picker-поле — выбор файлов из менеджера прямо в форме
- Drag-and-drop — перетаскивание для изменения порядка в picker
- Подсветка навигации — при переходе к файлу из picker
- Проверка файлов — детекция несуществующих файлов (broken state)
- Превью — клик по изображению открывает полноразмерный просмотр
- Не-изображения — отображение иконки с расширением для PDF, DOC и т.д.
- Layouts / Json — полная интеграция с moonshine/layouts-field и Json-полями
Конфигурация v4
| Параметр | По умолчанию | Описание |
|---|---|---|
auto_menu |
true |
Автоматически добавить в боковое меню |
disk |
public |
Диск файлового хранилища (только локальный) |
allowed_ext |
jpg,jpeg,png,gif,... |
Разрешённые для загрузки расширения (проверка по MIME + расширению) |
max_file_size |
10485760 (10 MB) |
Максимальный размер загружаемого файла в байтах |
default_view |
table |
Вид по умолчанию: table или list |
Настройка v3 (MoonShine 4)
Добавьте в config/moonshine.php:
'media_manager' => [ 'auto_menu' => true, 'disk' => config('filesystem.default', 'public'), 'allowed_ext' => 'jpg,jpeg,png,pdf,doc,docx,zip', 'default_view' => 'table', ],
Для добавления в меню:
use YuriZoom\MoonShineMediaManager\Pages\MediaManagerPage; protected function menu(): array { return [ MenuItem::make(new MediaManagerPage()), ]; }
Настройка v2 (MoonShine 3)
Если необходимо изменить настройки, добавьте в файл config/moonshine.php:
[
'media_manager' => [
// Автоматическое добавление в меню
'auto_menu' => true,
// Корневая директория
'disk' => config('filesystem.default', 'public'),
// Разрешенные для загрузки расширения файлов
'allowed_ext' => 'jpg,jpeg,png,pdf,doc,docx,zip',
// Вид менеджера по-умолчанию
'default_view' => 'table',
]
]
Для добавления в меню в app/MoonShine/Layouts/MoonShineLayout.php:
use YuriZoom\MoonShineMediaManager\Pages\MediaManagerPage; protected function menu(): array { return [ MenuItem::make(new MediaManagerPage()), ]; }
Разработка
Для сборки ассетов (JS + CSS) из исходников:
npm install npm run build
Готовые файлы появятся в dist/. Для публикации в проекте:
php artisan vendor:publish --tag=moonshine-media-manager-assets --force

