Пролог

Руководство по обновлению MoonShine 3.x → 4.0

Автоматический апгрейд

Для упрощения процесса миграции вы можете воспользоваться пакетом warete/moonshine-upgrade, который автоматически выполнит все необходимые изменения для перехода на MoonShine 4.0.

Обновление пакета

Измените версию пакета в composer.json и обновите зависимости.

{
"require": {
"moonshine/moonshine": "^4.0"
}
}
{
"require": {
"moonshine/moonshine": "^4.0"
}
}
composer update
composer update

Изменения пространств имен

-use MoonShine\Laravel\Forms\FiltersForm;
+use MoonShine\Crud\Forms\FiltersForm;
 
-use MoonShine\Laravel\Forms\LoginForm;
+use MoonShine\Crud\Forms\LoginForm;
 
-use MoonShine\Laravel\Http\Responses\MoonShineJsonResponse;
+use MoonShine\Crud\JsonResponse;
 
-use MoonShine\Laravel\MoonShineRequest;
+use MoonShine\Contracts\Core\DependencyInjection\CrudRequestContract;
 
-use MoonShine\Laravel\Enums\Action;
+use MoonShine\Support\Enums\Action;
 
-use MoonShine\Laravel\Enums\Ability;
+use MoonShine\Support\Enums\Ability;
 
-use MoonShine\Laravel\Traits\WithComponentsPusher;
+use MoonShine\Crud\Traits\WithComponentsPusher;
-use MoonShine\Laravel\Forms\FiltersForm;
+use MoonShine\Crud\Forms\FiltersForm;
 
-use MoonShine\Laravel\Forms\LoginForm;
+use MoonShine\Crud\Forms\LoginForm;
 
-use MoonShine\Laravel\Http\Responses\MoonShineJsonResponse;
+use MoonShine\Crud\JsonResponse;
 
-use MoonShine\Laravel\MoonShineRequest;
+use MoonShine\Contracts\Core\DependencyInjection\CrudRequestContract;
 
-use MoonShine\Laravel\Enums\Action;
+use MoonShine\Support\Enums\Action;
 
-use MoonShine\Laravel\Enums\Ability;
+use MoonShine\Support\Enums\Ability;
 
-use MoonShine\Laravel\Traits\WithComponentsPusher;
+use MoonShine\Crud\Traits\WithComponentsPusher;

Изменения в структуре ресурсов

Многие методы и свойства перенесены из ресурсов в соответствующие CRUD-страницы.

Методы rules(), modifyFormComponent() перенесены в класс формы.

Методы metrics(), queryTags(), filters(), modifyListComponent() перенесены в класс индексной страницы.

Метод modifyDetailComponent() перенесён в класс детальной страницы.

Метод indexButtons() удален из ресурса, вместо него следует использовать метод buttons() в классе индексной страницы.

Метод topButtons() удален из ресурса, вместо него следует использовать методы topLeftButtons() и topRightButtons() в классе индексной страницы.

Метод formButtons() удален из ресурса, вместо него следует использовать метод buttons() в классе страницы формы.

Метод formBuilderButtons() удален из ресурса, вместо него следует использовать метод formButtons() в классе страницы формы.

Свойства $clickAction, $stickyTable, $stickyButtons, $columnSelection удалены из ресурса. Вместо них следует переопределять метод modifyListComponent() в классе индексной страницы.

Это не полный список изменений в ресурсе, но процесс переноса всего соответствующего функционала из ресурса в CRUD-страницы довольно интуитивный и не должен составить труда.

Изменения в полях

Удалено поле StackFields, вместо него следует использовать поле Fieldset.

-StackFields::make('Title', [
- Text::make('Field 1'),
- Text::make('Field 2'),
-])
 
+Fieldset::make('Title', [
+ Text::make('Field 1'),
+ Text::make('Field 2'),
+])
-StackFields::make('Title', [
- Text::make('Field 1'),
- Text::make('Field 2'),
-])
 
+Fieldset::make('Title', [
+ Text::make('Field 1'),
+ Text::make('Field 2'),
+])

Изменения в Layout

Удален CompactLayout

Шаблон CompactLayout был удален. Если вы использовали этот шаблон, перейдите на расширение стандартного AppLayout.

-use MoonShine\Laravel\Layouts\CompactLayout;
+use MoonShine\Laravel\Layouts\AppLayout;
-use MoonShine\Laravel\Layouts\CompactLayout;
+use MoonShine\Laravel\Layouts\AppLayout;

Новые палитры

Введена система палитр для управления цветовой схемой. По умолчанию используется PurplePalette.

Подробнее о работе с палитрами смотрите в разделе Color Manager.

Изменения в MenuItem

Параметры в методе MenuItem::make() поменялись местами, теперь первым идет $filler, затем $label.

Параметр $label стал необязательным, по умолчанию он берется из метода getLabel() наполнителя.

-MenuItem::make('Settings', SettingResource::class)
+MenuItem::make(SettingResource::class)
-MenuItem::make('Settings', SettingResource::class)
+MenuItem::make(SettingResource::class)

Изменения в компонентах

В компоненте Profile удален входной параметр $withBorder.

Устаревшие классы и методы

Следующие классы и методы объявлены устаревшими и будут удалены в версии 5.0.

Устаревшие классы

Класс Замена
MoonShine\Laravel\Notifications\NotificationButton MoonShine\Crud\Notifications\NotificationButton
MoonShine\Laravel\Http\Responses\MoonShineJsonResponse MoonShine\Crud\JsonResponse
MoonShine\Laravel\MoonShineUI Вместо MoonShineUI::toast() теперь хелпер toast()
MoonShine\Laravel\Handlers\Handlers MoonShine\Crud\Handlers\BaseHandlers
MoonShine\Laravel\Handlers\Handler MoonShine\Crud\Handlers\BaseHandler

Устаревшие методы в ModelResource

Метод Замена
getIgnoredFields() Перенесено в IndexPage
filters() Перенесено в IndexPage
hasFilters() Перенесено в IndexPage
queryTags() Перенесено в IndexPage
hasQueryTags() Перенесено в IndexPage
handlers() Перенесено в IndexPage
hasHandlers() Перенесено в IndexPage
getHandlers() Перенесено в IndexPage

Устаревшие трейты

Трейт Замена
HasFilters Перенос в IndexPage
HasQueryTags Перенос в IndexPage
HasHandlers Перенос в IndexPage

Все перечисленные классы и методы будут полностью удалены в версии 5.0. Рекомендуется перейти на новые альтернативы.

Асинхронные методы

Всем асинхронным методам нужно добавить атрибут #[AsyncMethod].

Асинхронные методы теперь поддерживают "DI".

use MoonShine\Crud\JsonResponse;
use MoonShine\Support\Attributes\AsyncMethod;
 
class MyPage extends Page
{
#[AsyncMethod]
public function someAsyncMethod(JsonResponse $response): JsonResponse
{
return $response->toast('Loaded successfully');
}
}
use MoonShine\Crud\JsonResponse;
use MoonShine\Support\Attributes\AsyncMethod;
 
class MyPage extends Page
{
#[AsyncMethod]
public function someAsyncMethod(JsonResponse $response): JsonResponse
{
return $response->toast('Loaded successfully');
}
}