定制 yurizoom/moonshine-media-manager 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

yurizoom/moonshine-media-manager

Composer 安装命令:

composer require yurizoom/moonshine-media-manager

包简介

Media manager for MoonShine

README 文档

README

Файловый менеджер для MoonShine.

Поддержка версий

MoonShine Пакет Документация
4.0+ 4.x Ниже ↓
4.0+ 3.x Ниже ↓
3.0+ 2.x
2.0+ 1.x

Скриншоты

Менеджер Пикер
Media Manager Media Manager Picker

Установка

composer require yurizoom/moonshine-media-manager

Настройка v4 (MoonShine 4+)

Полностью AJAX — загрузка, удаление, переименование, навигация по папкам без перезагрузки страницы.

После установки опубликуйте ассеты и конфиг:

php artisan vendor:publish --tag=moonshine-media-manager-assets
php artisan vendor:publish --tag=moonshine-media-manager-config

Конфигурация

Конфиг публикуется в config/media-manager.php (корневой файл). Поддерживается fallback — если ключи найдены в config/moonshine.phpmedia_manager, они тоже применяются. Приоритет: standalone файл > moonshine.php > дефолты пакета.

// config/media-manager.php
return [
    'disk' => config('filesystems.default', 'public'),
    'allowed_ext' => 'jpg,jpeg,png,gif,webp,avif,svg,bmp,ico,heic,pdf,doc,docx,xls,xlsx,ppt,pptx,zip,rar,7z,tar,gz,txt,md,csv,json,yaml,yml,mp3,wav,ogg,m4a,aac,flac,mp4,avi,mov,mkv,webm',
    'max_file_size' => env('MOONSHINE_MEDIA_MANAGER_MAX_FILE_SIZE', 10 * 1024 * 1024),
    'rename_duplicates' => env('MOONSHINE_MEDIA_MANAGER_RENAME_DUPLICATES', true),
    'auto_menu' => env('MOONSHINE_MEDIA_MANAGER_AUTO_MENU', true),
    'ability' => env('MOONSHINE_MEDIA_MANAGER_ABILITY'),
    '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 навигация — переход по папкам без перезагрузки
  • Поиск / фильтр / сортировка — мгновенный поиск по имени, фильтр по типу (Images / Documents / Video / Audio / Archives), сортировка по имени / дате / размеру
  • Загрузка файлов — множественная загрузка с проверкой MIME, расширения и размера. Drag-and-drop из файлового менеджера в любую область страницы. Redesigned modal с превью выбранных файлов и размером.
  • Replace file — перезапись файла по тому же пути (контент меняется, URL не ломается)
  • Move file — перемещение через folder browser без ввода путей вручную
  • Создание папок — прямо из интерфейса, с проверкой на существование
  • Переименование — с валидацией конфликтов и дубликатов
  • Bulk delete — массовое удаление выбранных файлов из selection bar
  • Удаление — с подтверждением
  • Скачивание — по клику
  • URL файла — просмотр ссылки с копированием
  • Inline-валидация — ошибки показываются прямо в модалках, всё локализовано
  • Два вида — таблица и сетка (grid)
  • Пикер запоминает папку — при повторном открытии возвращается в последнюю папку
  • Lazy-load — превью загружаются только при скролле к ним
  • Cache-busting — после Replace браузер автоматически обновляет изображение
  • Picker-поле — выбор файлов из менеджера прямо в форме
  • Drag-and-drop reorder — перетаскивание для изменения порядка в picker
  • Layouts / Json — полная интеграция с moonshine/layouts-field и Json-полями

Authorization (опционально)

По умолчанию любой аутентифицированный юзер MoonShine имеет полный доступ к менеджеру. Для ограничения — задайте Gate ability в .env:

MOONSHINE_MEDIA_MANAGER_ABILITY=manage-media

И определите Gate в AuthServiceProvider:

use Illuminate\Support\Facades\Gate;

Gate::define('manage-media', function (User $user) {
    return $user->hasRole('admin');
});

Теперь только админы имеют доступ. Остальные получают 403.

События

Пакет диспатчит события для интеграции с внешним кодом:

Событие Когда Параметры
MediaManagerFileUploaded Файл загружен $path, $disk
MediaManagerFileReplaced Файл заменён (Replace) $path, $disk
MediaManagerFileDeleted Файл удалён $path, $disk
use YuriZoom\MoonShineMediaManager\Events\MediaManagerFileUploaded;

protected $listen = [
    MediaManagerFileUploaded::class => [
        GenerateThumbnailListener::class,
    ],
];

Конфигурация v4

Параметр По умолчанию Описание
disk public Диск файлового хранилища (только локальный)
allowed_ext jpg,jpeg,png,... Разрешённые расширения (с MIME-проверкой)
max_file_size 10485760 (10 MB) Макс. размер загружаемого файла
rename_duplicates true Переименовать дубликат (file.jpgfile-1.jpg) вместо перезаписи
auto_menu true Автоматически добавить в боковое меню
ability null Gate ability для авторизации (null = без проверки)
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

Лицензия

The MIT License (MIT).

yurizoom/moonshine-media-manager 适用场景与选型建议

yurizoom/moonshine-media-manager 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.17k 次下载、GitHub Stars 达 11, 最近一次更新时间为 2024 年 06 月 09 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「media」 「manager」 「moonshine」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 yurizoom/moonshine-media-manager 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 yurizoom/moonshine-media-manager 我们能提供哪些服务?
定制开发 / 二次开发

基于 yurizoom/moonshine-media-manager 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 2.17k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 11
  • 点击次数: 5
  • 依赖项目数: 1
  • 推荐数: 1

GitHub 信息

  • Stars: 11
  • Watchers: 1
  • Forks: 2
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-06-09