Обновление пакета
1. Обновление composer.json
Измените версию пакета в вашем composer.json:
{"require": {"moonshine/moonshine": "^3.0"}}
{"require": {"moonshine/moonshine": "^3.0"}}
2. Создание резервных копий
Перед обновлением необходимо сделать резервные копии следующих файлов:
mv config/moonshine.php config/moonshine_old.phpmv app/Providers/MoonShineServiceProvider.php app/Providers/MoonShineServiceProvider_old.phpmv app/MoonShine/Pages/Dashboard.php app/MoonShine/Pages/Dashboard_old.php
mv config/moonshine.php config/moonshine_old.phpmv app/Providers/MoonShineServiceProvider.php app/Providers/MoonShineServiceProvider_old.phpmv app/MoonShine/Pages/Dashboard.php app/MoonShine/Pages/Dashboard_old.php
Эти файлы понадобятся для переноса конфигурации и настроек, смотрите раздел Список изменений.
3. Обновление конфигурации приложения
Если у вас Laravel < 11, то в конфигурации config/app.php
необходимо найти и удалить App\Providers\MoonShineServiceProvider::class
После выполнения команды moonshine:install
сервис-провайдер будет добавлен автоматически.
4. Запуск обновления
composer update
composer update
Первоначальная настройка
1. Установка новой версии
Выполните команду:
php artisan moonshine:install
php artisan moonshine:install
Эта команда создаст:
- Новый сервис-провайдер
- Обновленную конфигурацию
- Новый Layout
- Новый Dashboard
2. Миграция настроек
- Перенесите параметры из старого конфига (
moonshine_old.php
) в новый, смотрите документацию по конфигурации - В новой версии изменилась структура меню:
- Откройте
app/MoonShine/Layouts/MoonShineLayout.php
- Скопируйте старое меню из
MoonShineServiceProvider_old.php
в методmenu
- У иконок удалите префикс
heroicons.outline.
- Обновите все экземпляры ресурсов на строковые классы:
// БылоMenuItem::make('Settings', new SettingResource(), 'heroicons.outline.adjustments-vertical')// СталоMenuItem::make('Settings', SettingResource::class, 'adjustments-vertical')
// БылоMenuItem::make('Settings', new SettingResource(), 'heroicons.outline.adjustments-vertical')// СталоMenuItem::make('Settings', SettingResource::class, 'adjustments-vertical')
3. Регистрация ресурсов и страниц
В новом MoonShineServiceProvider.php
необходимо зарегистрировать все ресурсы и страницы:
$core->resources([MoonShineUserResource::class,MoonShineUserRoleResource::class,// Добавьте все ваши ресурсы]);$core->pages([...$config->getPages(),SettingPage::class,]);
$core->resources([MoonShineUserResource::class,MoonShineUserRoleResource::class,// Добавьте все ваши ресурсы]);$core->pages([...$config->getPages(),SettingPage::class,]);
Команды для генерации списков:
Для импорта пространств имен:
find app/MoonShine/Resources -type f | sed "s/app/use App/" | sed "s|/|\\\|g" | sed "s/.php/;/" | sort
find app/MoonShine/Resources -type f | sed "s/app/use App/" | sed "s|/|\\\|g" | sed "s/.php/;/" | sort
Для списка ресурсов:
find app/MoonShine/Resources -type f -exec basename {} \; | sed "s/.php/::class,/" | sort
find app/MoonShine/Resources -type f -exec basename {} \; | sed "s/.php/::class,/" | sort
4. Обновление Dashboard
- Перенесите нужные компоненты из
Dashboard_old.php
в новыйDashboard.php
- Учтите изменения из раздела Список изменений
5. Удаление старых файлов
После успешной миграции удалите:
# Старый Layout (если существует)rm app/MoonShine/MoonShineLayout.php# Бэкапы файлов от 2.xrm config/moonshine_old.phprm app/Providers/MoonShineServiceProvider_old.phprm app/MoonShine/Pages/Dashboard_old.php
# Старый Layout (если существует)rm app/MoonShine/MoonShineLayout.php# Бэкапы файлов от 2.xrm config/moonshine_old.phprm app/Providers/MoonShineServiceProvider_old.phprm app/MoonShine/Pages/Dashboard_old.php
Список изменений
Пространства имен
Основные изменения
MoonShine\Resources\ → MoonShine\Laravel\Resources\MoonShine\Fields\Relationships\ → MoonShine\Laravel\Fields\Relationships\MoonShine\Fields\Slug → MoonShine\Laravel\Fields\SlugMoonShine\Fields\ → MoonShine\UI\Fields\MoonShine\Decorations\Block → MoonShine\UI\Components\Layout\BoxMoonShine\Decorations\ → MoonShine\UI\Components\Layout\*(некоторые на MoonShine\UI\Components\, проверьте вручную)MoonShine\Enums\ → MoonShine\Support\Enums\MoonShine\Pages\ → MoonShine\Laravel\Pages\MoonShine\Models\ → MoonShine\Laravel\Models\MoonShine\QueryTags\ → MoonShine\Laravel\QueryTags\MoonShine\Attributes\ → MoonShine\Support\Attributes\MoonShine\Components\ → MoonShine\UI\Components\MoonShine\Metrics\ → MoonShine\UI\Components\Metrics\Wrapped\MoonShine\ActionButtons\ → MoonShine\UI\Components\MoonShine\Http\Responses\ → MoonShine\Laravel\Http\Responses\MoonShine\Http\Controllers\ → MoonShine\Laravel\Http\Controllers\MoonShine\MoonShineAuth → MoonShine\Laravel\MoonShineAuth
MoonShine\Resources\ → MoonShine\Laravel\Resources\MoonShine\Fields\Relationships\ → MoonShine\Laravel\Fields\Relationships\MoonShine\Fields\Slug → MoonShine\Laravel\Fields\SlugMoonShine\Fields\ → MoonShine\UI\Fields\MoonShine\Decorations\Block → MoonShine\UI\Components\Layout\BoxMoonShine\Decorations\ → MoonShine\UI\Components\Layout\*(некоторые на MoonShine\UI\Components\, проверьте вручную)MoonShine\Enums\ → MoonShine\Support\Enums\MoonShine\Pages\ → MoonShine\Laravel\Pages\MoonShine\Models\ → MoonShine\Laravel\Models\MoonShine\QueryTags\ → MoonShine\Laravel\QueryTags\MoonShine\Attributes\ → MoonShine\Support\Attributes\MoonShine\Components\ → MoonShine\UI\Components\MoonShine\Metrics\ → MoonShine\UI\Components\Metrics\Wrapped\MoonShine\ActionButtons\ → MoonShine\UI\Components\MoonShine\Http\Responses\ → MoonShine\Laravel\Http\Responses\MoonShine\Http\Controllers\ → MoonShine\Laravel\Http\Controllers\MoonShine\MoonShineAuth → MoonShine\Laravel\MoonShineAuth
Дополнительные пакеты
При необходимости установите и обновите пространства имен для:
MoonShine\Laravel\Handlers\ExportHandler
MoonShine\Laravel\Handlers\ImportHandler
MoonShine\UI\Components\Metrics\Wrapped\DonutChartMetric
MoonShine\UI\Components\Metrics\Wrapped\LineChartMetric
MoonShine\Fields\Code
MoonShine\Fields\Markdown
MoonShine\Fields\TinyMce
Методы
Основные изменения
- Создание экземпляров ресурсов и страниц:
// Былоnew NameResource()// Стало// Рекомендуется через DI// или:app(NameResource::class)
// Былоnew NameResource()// Стало// Рекомендуется через DI// или:app(NameResource::class)
- Сигнатуры методов:
// Былоpublic function components(): arraypublic function title(): stringpublic function breadcrumbs(): stringpublic function rules(Model $item): arrayprotected function afterUpdated(Model $user): Modelpublic function detailButtons(): arraypublic function modifyListComponent(MoonShineRenderable|TableBuilder $table): MoonShineRenderable$field->getData()detailPageUrlMoonShineAuth::guard()getActiveActions()// Сталоprotected function components(): iterablepublic function getTitle(): stringpublic function getBreadcrumbs(): stringprotected function rules($item): arrayprotected function afterUpdated($user): Modelpublic function detailButtons(): ListOfpublic function modifyListComponent(ComponentContract $table): ComponentContract$field->getData()->getOriginal()getDetailPageUrlMoonShineAuth::getGuard()activeActions()
// Былоpublic function components(): arraypublic function title(): stringpublic function breadcrumbs(): stringpublic function rules(Model $item): arrayprotected function afterUpdated(Model $user): Modelpublic function detailButtons(): arraypublic function modifyListComponent(MoonShineRenderable|TableBuilder $table): MoonShineRenderable$field->getData()detailPageUrlMoonShineAuth::guard()getActiveActions()// Сталоprotected function components(): iterablepublic function getTitle(): stringpublic function getBreadcrumbs(): stringprotected function rules($item): arrayprotected function afterUpdated($user): Modelpublic function detailButtons(): ListOfpublic function modifyListComponent(ComponentContract $table): ComponentContract$field->getData()->getOriginal()getDetailPageUrlMoonShineAuth::getGuard()activeActions()
- Изменения в методах полей:
// Былоpublic function fields(): array// Сталоprotected function indexFields(): iterable // допускает только поляprotected function detailFields(): iterableprotected function formFields(): iterable
// Былоpublic function fields(): array// Сталоprotected function indexFields(): iterable // допускает только поляprotected function detailFields(): iterableprotected function formFields(): iterable
- Атрибуты таблиц:
// Новый форматTableBuilder::make()->tdAttributes(fn(mixed $data, int $row, TableBuilder $table): array =>$row === 3 ? ['class' => 'bgc-yellow'] : [])->tdAttributes(fn(mixed $data, int $row, int $cell, TableBuilder $table): array =>$cell === 3 ? ['align' => 'right'] : [])
// Новый форматTableBuilder::make()->tdAttributes(fn(mixed $data, int $row, TableBuilder $table): array =>$row === 3 ? ['class' => 'bgc-yellow'] : [])->tdAttributes(fn(mixed $data, int $row, int $cell, TableBuilder $table): array =>$cell === 3 ? ['align' => 'right'] : [])
- Изменения в других методах:
- Хелпер
to_page
→toPage
- Вместо метода
columnSpan
у компонентов использовать метод компонентаColumn
:Column::make([...])->columnSpan(..)
- Вместо
expansion('url')
нужно использовать методsuffix('url')
Удаленные методы
- Методы отображения полей:
- hideOnIndex, showOnIndex
- hideOnForm, showOnForm
- hideOnCreate, showOnCreate
- hideOnUpdate, showOnUpdate
- hideOnDetail, showOnDetail
- hideOnAll
- hideOnExport, showOnExport
- useOnImport (используйте пакет import-export)
В разделе Routes можно найти альтернативные методы
- Хелперы:
- form
- table
- actionBtn
Переменные
Основные изменения
- Иконки:
- Удалите префиксы
heroicons.outline
иheroicons.solid
- Теперь эти иконки доступны по умолчанию
- Меню:
// БылоMenuItem::make('Settings', new SettingResource(), 'heroicons.outline.adjustments-vertical')// СталоMenuItem::make('Settings', SettingResource::class, 'adjustments-vertical')
// БылоMenuItem::make('Settings', new SettingResource(), 'heroicons.outline.adjustments-vertical')// СталоMenuItem::make('Settings', SettingResource::class, 'adjustments-vertical')
- Асинхронные события:
// Было->async(asyncUrl: ..., asyncEvents: ...)'table-updated-{name}'// Стало->async(url: ..., events: ...)AlpineJs::event(JsEvent::TABLE_UPDATED, {name})
// Было->async(asyncUrl: ..., asyncEvents: ...)'table-updated-{name}'// Стало->async(url: ..., events: ...)AlpineJs::event(JsEvent::TABLE_UPDATED, {name})
- Направление сортировки:
// Былоprotected string $sortDirection = 'ASC';// Сталоprotected SortDirection $sortDirection = SortDirection::ASC;
// Былоprotected string $sortDirection = 'ASC';// Сталоprotected SortDirection $sortDirection = SortDirection::ASC;
- Assets:
// Было$assets // строки// Стало$assets // принимает AssetElementContract, такие как Css, InlineCss, Js, InlineJsДля управления используется [AssetManager](/docs/3.x/appearance/assets).
// Было$assets // строки// Стало$assets // принимает AssetElementContract, такие как Css, InlineCss, Js, InlineJsДля управления используется [AssetManager](/docs/3.x/appearance/assets).
Удаленные переменные
protected bool $isAsync = true;
(теперь включено по умолчанию)