-
Notifications
You must be signed in to change notification settings - Fork 33
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
350 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,357 @@ | ||
<x-page title="Upgrade Guide" :sectionMenu="null"> | ||
<x-page | ||
title="Upgrade Guide" | ||
:sectionMenu="null" | ||
:videos="[ | ||
['url' => 'https://www.youtube.com/embed/y4RB25jb31c', 'title' => 'Video upgrade guide'], | ||
]" | ||
> | ||
|
||
<x-moonshine::badge color="green"> | ||
Upgrading To 2.0 From 1.5 | ||
</x-moonshine::badge> | ||
|
||
<x-sub-title id="requirements" hashtag="1">Минимальные требования</x-sub-title> | ||
|
||
<x-ul :items="['php >=8.1', 'laravel >= 10.23']"></x-ul> | ||
|
||
<x-sub-title id="composer" hashtag="2">Composer.json</x-sub-title> | ||
|
||
<x-p> | ||
Изменить версию <strong>MoonShine</strong>. | ||
</x-p> | ||
|
||
<x-code language="json"> | ||
"require": { | ||
"php": "^8.1", | ||
"guzzlehttp/guzzle": "^7.2", | ||
"laravel/framework": "^10.23", | ||
"lee-to/moonshine-algolia-search": "^1.0", | ||
"moonshine/moonshine": "^1.60" // [tl! -- **] | ||
"moonshine/moonshine": "^2.0.0.rc.3" // [tl! ++ **] | ||
}, | ||
</x-code> | ||
|
||
<x-p> | ||
Выполнить консольную команду. | ||
</x-p> | ||
|
||
<x-code language="shell"> | ||
composer update | ||
</x-code> | ||
|
||
<x-moonshine::alert type="warning" icon="heroicons.information-circle"> | ||
В процессе обновления возникнут ошибки. Это связано с тем что некоторые компоненты админ-панели были изменены. | ||
Следующие шаги помогут устранить эти ошибки. | ||
</x-moonshine::alert> | ||
|
||
<x-sub-title id="provider" hashtag="3">MoonShineServiceProvider</x-sub-title> | ||
|
||
<x-p> | ||
Необходимо изменить <code>MoonShineServiceProvider</code>. Он теперь наследуется от MoonShineApplicationServiceProvider, | ||
а объявление меню вынесено в отдельный метод <code>menu()</code>. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
use Illuminate\Support\ServiceProvider; // [tl! -- **] | ||
use MoonShine\Providers\MoonShineApplicationServiceProvider; // [tl! ++ **] | ||
//... | ||
|
||
class MoonShineServiceProvider extends ServiceProvider // [tl! -- **] | ||
class MoonShineServiceProvider extends MoonShineApplicationServiceProvider // [tl! ++ **] | ||
{ | ||
|
||
public function boot(): void // [tl! -- **] | ||
protected function menu(): array // [tl! ++ **] | ||
{ | ||
app(MoonShine::class)->menu([ // [tl! -- **] | ||
return [ // [tl! ++ **] | ||
MenuGroup::make('System', [ | ||
MenuItem::make('Settings', new SettingResource(), 'heroicons.outline.adjustments-vertical'), | ||
MenuItem::make('Admins', new MoonShineUserResource(), 'heroicons.outline.users'), | ||
MenuItem::make('Roles', new MoonShineUserRoleResource(), 'heroicons.outline.shield-exclamation'), | ||
], 'heroicons.outline.user-group')->canSee(static function () { | ||
return auth('moonshine')->user()->moonshine_user_role_id === 1; | ||
}), | ||
|
||
//... | ||
|
||
]); // [tl! -- **] | ||
]; // [tl! ++ **] | ||
} | ||
} | ||
</x-code> | ||
|
||
<x-sub-title id="icons" hashtag="4">Icons</x-sub-title> | ||
|
||
<x-p> | ||
В <strong>MoonShine 2.0</strong> используются только иконки из набора Heroicons, | ||
поэтому необходимо произвести замену старых системных иконок (add, app, bookmark, | ||
bookmark, clip, delete, edit, export, filter, search, show и users). | ||
</x-p> | ||
|
||
<x-moonshine::alert type="default" icon="heroicons.book-open"> | ||
За более подробной информацией обратитесь к разделу | ||
<x-link link="{{ route('moonshine.page', 'appearance-icons') }}">Icons</x-link>. | ||
</x-moonshine::alert> | ||
|
||
<x-sub-title id="resources" hashtag="5">Resources</x-sub-title> | ||
|
||
<x-p> | ||
В <strong>MoonShine 2.0</strong> ресурсы изолированны от моделей, | ||
но есть специальный <em>ModelResource</em> для работы с Eloquent. | ||
</x-p> | ||
|
||
<x-p> | ||
<em>Resource</em> необходимо заменить на <em>ModelResource</em>, публичные свойства на защищенные. | ||
</x-p> | ||
|
||
<x-p> | ||
Свойство для отображения в полях отношений <code>titleField</code> необходимо переименовать в <code>column</code>. | ||
</x-p> | ||
|
||
<x-p> | ||
Свойство для перехода после сохранения <code>routeAfterSave</code> в <strong>MoonShine 2.0</strong> заменено на | ||
метод <code>redirectAfterSave()</code> который возвращает строку с маршрутом на который необходимо сделать | ||
перенаправление. | ||
</x-p> | ||
|
||
<x-p> | ||
Так же были переименованы некоторые свойства. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Resources\Resource; // [tl! -- **] | ||
use MoonShine\Resources\ModelResource; // [tl! ++ **] | ||
|
||
//... | ||
|
||
class ArticleResource extends Resource // [tl! -- **] | ||
class ArticleResource extends ModelResource // [tl! ++ **] | ||
{ | ||
public static string $model = Article::class; // [tl! -- **] | ||
protected string $model = Article::class; // [tl! ++ **] | ||
|
||
public static string $title = 'Articles'; // [tl! -- **] | ||
protected string $title = 'Articles'; // [tl! ++ **] | ||
|
||
public string $titleField = 'title'; // [tl! -- **] | ||
protected string $column = 'title'; // [tl! ++ **] | ||
|
||
protected string $routeAfterSave = 'index'; // [tl! -- **] | ||
|
||
public static string $orderField = 'created_at'; // [tl! -- **] | ||
protected string $sortColumn = 'created_at'; // [tl! ++ **] | ||
|
||
public static string $orderType = 'DESC'; // [tl! -- **] | ||
protected string $sortDirection = 'DESC'; // [tl! ++ **] | ||
|
||
public static array $with = ['author', 'comments']; // [tl! -- **] | ||
protected array $with = ['author', 'comments']; // [tl! ++ **] | ||
|
||
//... | ||
|
||
} | ||
</x-code> | ||
|
||
<x-sub-title id="fields" hashtag="6">Fields</x-sub-title> | ||
|
||
<x-p> | ||
Изменения в <strong>MoonShine 2.0</strong> затронули и поля. | ||
</x-p> | ||
|
||
<x-p> | ||
У всех полей отношений изменился <em>namespace</em>. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Fields\Relationships\BelongsTo; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\BelongsTo; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\BelongsToMany; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\BelongsToMany; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\HasMany; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\HasMany; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\HasManyThrough; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\HasManyThrough; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\HasOne; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\HasOne; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\HasOneThrough; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\HasOneThrough; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\MorphMany; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\MorphMany; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\MorphTo; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\MorphTo; // [tl! ++ **] | ||
|
||
use MoonShine\Fields\Relationships\MorphToMany; // [tl! -- **] | ||
use MoonShine\Fields\Relationships\MorphToMany; // [tl! ++ **] | ||
</x-code> | ||
|
||
<x-moonshine::alert type="warning" icon="heroicons.information-circle"> | ||
У полей отношений обязательно необходимо указать ресурс модели.<br /> | ||
Второй параметр - не поле в таблице, а наименование отношения! | ||
</x-moonshine::alert> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Fields\Relationships\BelongsTo; | ||
|
||
class ArticleResource extends ModelResource | ||
{ | ||
//... | ||
|
||
public function fields(): array | ||
{ | ||
BelongsTo::make('Author', resource: 'name') // [tl! -- **] | ||
BelongsTo::make('Author', 'author', resource: new MoonShineUserResource()); // [tl! ++ **] | ||
|
||
//... | ||
} | ||
|
||
//... | ||
} | ||
</x-code> | ||
|
||
<x-p> | ||
В <strong>MoonShine 2.0</strong> для полей <em>HasOne</em> и <em>HasMany</em> больше нет разделения и | ||
отображаются только в resourceMode режиме. Методы <code>removable()</code> и <code>fullPage()</code> были исключены.<br /> | ||
Если данные поля необходимо расположить в основной форме, | ||
то можно воспользоваться полем | ||
<x-link link="{{ route('moonshine.page', 'fields-json') . '#relation' }}"><em>Json</em> в режиме отношения</x-link>. | ||
</x-p> | ||
|
||
<x-p> | ||
Метод <code>onlyCount()</code> поля <em>HasMany</em> переименован в <code>onlyLink()</code> | ||
и теперь позволяет отобразить не только количество, но и создает ссылку для их просмотра записей. | ||
</x-p> | ||
|
||
<x-p> | ||
У поля отношения <em>BelongsToMany</em> метод <code>select()</code> переименован в <code>selectMode()</code>. | ||
</x-p> | ||
|
||
<x-p> | ||
<ul> | ||
<li> | ||
<code>SwitchBoolean</code> переименован в <code>Switcher</code> | ||
</li> | ||
<li> | ||
<code>SlideField</code> переименован в <code>RangeSlider</code> | ||
</li> | ||
</ul> | ||
</x-p> | ||
|
||
<x-sub-title id="filters" hashtag="7">Filters</x-sub-title> | ||
|
||
<x-p> | ||
В админ-панели <strong>MoonShine 2.0</strong> для построения фильтров используются так же поля, | ||
дублирующие поля для фильтров были исключены. | ||
</x-p> | ||
|
||
<x-moonshine::alert type="default" icon="heroicons.book-open"> | ||
За более подробной информацией обратитесь к разделу | ||
<x-link link="{{ route('moonshine.page', 'resources-filters') }}">Filters</x-link>. | ||
</x-moonshine::alert> | ||
|
||
<x-sub-title id="import-export" hashtag="8">Import / Export</x-sub-title> | ||
|
||
<x-p> | ||
По умолчанию импорт и экспорт уже включен во все ресурсы модели. | ||
</x-p> | ||
|
||
<x-code language="php"> | ||
use MoonShine\Actions\ExportAction; // [tl! -- **] | ||
use MoonShine\Actions\ImportAction; // [tl! -- **] | ||
|
||
class ArticleResource extends ModelResource | ||
{ | ||
//... | ||
|
||
public function actions(): array // [tl! -- **] | ||
{ // [tl! -- **] | ||
return [ // [tl! -- **] | ||
ExportAction::make('Export'), // [tl! -- **] | ||
ImportAction::make('Import') // [tl! -- **] | ||
]; // [tl! -- **] | ||
} // [tl! -- **] | ||
} | ||
</x-code> | ||
|
||
<x-moonshine::alert type="default" icon="heroicons.book-open"> | ||
За более подробной информацией обратитесь к разделу | ||
<x-link link="{{ route('moonshine.page', 'resources-import-export') }}">Import/Export</x-link>. | ||
</x-moonshine::alert> | ||
|
||
<x-sub-title id="actions" hashtag="9">Actions</x-sub-title> | ||
|
||
<x-p> | ||
<code>ItemActions</code>, <code>FormActions</code> и <code>DetailActions</code> и | ||
соответствующие методы были исключены из админ-панели.<br /> | ||
В <strong>MoonShine 2.0</strong> эту функцию выполняет <code>ActionButton</code>. | ||
</x-p> | ||
|
||
|
||
<x-code language="php"> | ||
use MoonShine\FormActions\FormAction; // [tl! -- **] | ||
use MoonShine\ItemActions\ItemAction; // [tl! -- **] | ||
|
||
class ArticleResource extends ModelResource | ||
{ | ||
//... | ||
|
||
public function itemActions(): array // [tl! -- **] | ||
public function indexButtons(): array // [tl! ++ **] | ||
{ | ||
return [ | ||
ItemAction::make('Go to', fn (Article $item) => to_route('articles.show', $item)) // [tl! -- **] | ||
ActionButton::make('Go to', fn (Article $item) => to_route('articles.show', $item)) // [tl! ++ **] | ||
]; | ||
} | ||
} | ||
</x-code> | ||
|
||
<x-moonshine::alert type="default" icon="heroicons.book-open"> | ||
За более подробной информацией обратитесь к разделу | ||
<x-link link="{{ route('moonshine.page', 'action_button') }}">ActionButton</x-link>. | ||
</x-moonshine::alert> | ||
|
||
<x-sub-title id="update" hashtag="10">Обновление зависимостей</x-sub-title> | ||
|
||
<x-p> | ||
После внесения всех изменений, необходимо попытаться еще раз выполнить обновление зависимостей. | ||
Обновление должно завершиться без ошибок. | ||
</x-p> | ||
|
||
<x-code language="shell"> | ||
composer update | ||
</x-code> | ||
|
||
<x-sub-title id="config" hashtag="11">Config</x-sub-title> | ||
|
||
<x-p> | ||
В новой версии <strong>MoonShine</strong> полностью изменился сonfig. | ||
Опубликовать новый конфигурационный файл можно через консольную команду. | ||
После публикации, можно внести необходимые изменения. | ||
</x-p> | ||
|
||
<x-code language="shell"> | ||
php artisan moonsine:install | ||
</x-code> | ||
|
||
<x-sub-title id="dashboard" hashtag="12">Dashboard</x-sub-title> | ||
|
||
<x-p> | ||
<em>Dashboard</em> как и <em>CustomPage</em> теперь это | ||
<x-link link="{{ route('moonshine.page', 'page-class') }}">Pages</x-link>. | ||
После установки, для <em>Dashboard</em> генерируется страница <code>app/MoonShine/Pages/Dashboard.php</code>. | ||
Необходимо перенести все компоненты в новую страницу. | ||
</x-p> | ||
|
||
<x-moonshine::alert type="success" icon="heroicons.check-badge" class="mt-8"> | ||
Поздравляем вас с успешным обновлением проекта! | ||
</x-moonshine::alert> | ||
|
||
</x-page> |