Меню

Вы просматриваете документацию старой версии MoonShine. Рассмотрите возможность обновления вашего проекта до MoonShine 2.x.

# Регистрация

В разделе изучения ресурсов мы уже разобрались как регистрировать разделы админ-панели, после чего они также появляются в меню

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use MoonShine\Menu\MenuItem;
use MoonShine\MoonShine;
use MoonShine\Resources\MoonShineUserResource;
use MoonShine\Resources\MoonShineUserRoleResource;
 
class MoonShineServiceProvider extends ServiceProvider
{
//...
 
public function boot()
{
app(MoonShine::class)->menu([
MenuItem::make('Admins', new MoonShineUserResource()),
MenuItem::make('Roles', new MoonShineUserRoleResource()),
]);
}
}

Но для удобства интерфейса мы также можем сгруппировать пункты меню

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use MoonShine\Menu\MenuItem;
use MoonShine\Menu\MenuGroup;
use MoonShine\MoonShine;
use MoonShine\Resources\MoonShineUserResource;
use MoonShine\Resources\MoonShineUserRoleResource;
 
class MoonShineServiceProvider extends ServiceProvider
{
//...
 
public function boot()
{
app(MoonShine::class)->menu([
MenuGroup::make('System', [
MenuItem::make('Admins', new MoonShineUserResource()),
MenuItem::make('Roles', new MoonShineUserRoleResource()),
])
]);
}
}

Всего лишь необходимо добавить ресурсы вторым параметром в класс MoonShine\Menu\MenuGroup. Ну а первый параметр название группы!

# Условие отображения

Отображать меню по условию

//...
app(MoonShine::class)->menu([
MenuGroup::make('System', [
MenuItem::make('Admins', new MoonShineUserResource()),
MenuItem::make('Roles', new MoonShineUserRoleResource()),
])->canSee(function(Request $request) {
return $request->user('moonshine')?->id === 1;
})
]);
//...

Возможность добавить кастомный линк

//...
app(MoonShine::class)->menu([
MenuItem::make('Документация Laravel', 'https://laravel.com')
]);
//...

Ссылки можно передавать через функцию

//...
app(MoonShine::class)->menu([
MenuItem::make('Admins', function () {
return (new MoonShineUserResource())->route('index');
}),
MenuItem::make('Home', fn() => route('home'))
]);
//...

# Иконка

Также есть возможность менять иконку у пункта меню

//...
app(MoonShine::class)->menu([
MenuGroup::make('Система', [
MenuItem::make('Admins', new MoonShineUserResource())->icon('heroicons.hashtag'),
MenuItem::make('Roles', new MoonShineUserRoleResource())->icon('heroicons.hashtag'),
])->icon('app')
// or
MenuGroup::make('Blog', [
MenuItem::make('Comments', new CommentResource(), 'heroicons.chat-bubble-left')
], 'heroicons.newspaper')
]);
//...

За более подробной информацией обратитесь к разделу Icons

# Метка

Также есть возможность добавить счетчик к пункту меню

//...
app(MoonShine::class)->menu([
MenuItem::make('Comments', new CommentResource())
->badge(fn() => Comment::query()->count()),
]);
//...

# Перевод

Для перевода пунктов меню необходимо в качестве названия передать ключ перевода и добавить метод translatable()

//...
app(MoonShine::class)->menu([
MenuItem::make('menu.Comments', new CommentResource())
->translatable()
// or
MenuItem::make('Comments', new CommentResource())
->translatable('menu')
]);
//...
// lang/ru/menu.php
 
return [
'Comments' => 'Комментарии',
];

Для перевода меток меню можно воспользоваться средствами перевода Laravel

//...
app(MoonShine::class)->menu([
MenuItem::make('Comments', new CommentResource())
->badge(fn() => __('menu.badge.new'))
]);
//...

# Разделитель

Пункты меню можно визуально разделить с помощью MenuDivider

use MoonShine\Menu\MenuDivider;
 
//...
app(MoonShine::class)->menu([
MenuItem::make('Categories', new CategoryResource()),
MenuDivider::make(),
MenuItem::make('Articles', new ArticleResource()),
]);
//...

В качестве разделителя можно использовать текст, для этого его нужно передать методу make()

use MoonShine\Menu\MenuDivider;
 
//...
app(MoonShine::class)->menu([
MenuItem::make('Categories', new CategoryResource()),
MenuDivider::make('Divider'),
MenuItem::make('Articles', new ArticleResource()),
]);
//...