Страница

Создание класса

Основы

Page является основой админ-панели MoonShine. Основное назначение Page - отображение компонентов.

Страницы с одинаковой логикой могут быть объединены в Resource.

Создание класса

Для создания класса страницы можно использовать консольную команду:

php artisan moonshine:page
php artisan moonshine:page

После ввода имени класса будет создан файл, который является основой для страницы в админ-панели.
По умолчанию он располагается в директории app/MoonShine/Pages.

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

php artisan moonshine:page OrderStatistics --dir=Pages/Statistics
php artisan moonshine:page OrderStatistics --dir=Pages/Statistics

Файл OrderStatistics будет создан в директории app/MoonShine/Pages/Statistics.

Заголовок

Заголовок страницы можно задать через свойство title, а subtitle задает подзаголовок.

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected string $title = 'CustomPage';
protected string $subtitle = 'Подзаголовок';
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected string $title = 'CustomPage';
protected string $subtitle = 'Подзаголовок';
 
//...
}

Если для заголовка и подзаголовка требуется какая-то логика, то методы title() и subtitle() позволяют ее реализовать.

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function title(): string
{
return $this->title ?: 'CustomPage';
}
 
public function subtitle(): string
{
return $this->subtitle ?: 'Подзаголовок';
}
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function title(): string
{
return $this->title ?: 'CustomPage';
}
 
public function subtitle(): string
{
return $this->subtitle ?: 'Подзаголовок';
}
 
//...
}

Компоненты

Страница строится из компонентов, которыми могут быть как декорации и компоненты самой админ-панели, FormBuilder, TableBuilder, так и просто blade компоненты, и даже компоненты Livewire.

Для регистрации компонентов страницы используется метод components().

use MoonShine\Decorations\Block;
use MoonShine\Decorations\Column;
use MoonShine\Decorations\Grid;
use MoonShine\Decorations\TextBlock;
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function components(): array
{
return [
Grid::make([
Column::make([
Block::make([
TextBlock::make('Заголовок 1', 'Текст 1')
])
])->columnSpan(6),
Column::make([
Block::make([
TextBlock::make('Заголовок 2', 'Текст 2')
])
])->columnSpan(6),
])
];
}
 
//...
}
use MoonShine\Decorations\Block;
use MoonShine\Decorations\Column;
use MoonShine\Decorations\Grid;
use MoonShine\Decorations\TextBlock;
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function components(): array
{
return [
Grid::make([
Column::make([
Block::make([
TextBlock::make('Заголовок 1', 'Текст 1')
])
])->columnSpan(6),
Column::make([
Block::make([
TextBlock::make('Заголовок 2', 'Текст 2')
])
])->columnSpan(6),
])
];
}
 
//...
}

Для более подробной информации обратитесь к разделу Компоненты.

За генерацию хлебных крошек отвечает метод breadcrumbs().

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function breadcrumbs(): array
{
return [
'#' => $this->title()
];
}
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
// ...
 
public function breadcrumbs(): array
{
return [
'#' => $this->title()
];
}
 
//...
}

Макет

По умолчанию страницы используют шаблон отображения Layout по умолчанию, но вы можете его изменить через свойство layout.

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected string $layout = 'moonshine::layouts.app';
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected string $layout = 'moonshine::layouts.app';
 
//...
}

Layout также можно переопределить с помощью метода layout().

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function layout(): string
{
return $this->layout;
}
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function layout(): string
{
return $this->layout;
}
 
//...
}

Псевдоним

Если необходимо изменить псевдоним страницы, это можно сделать через свойство alias.

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected ?string $alias = null;
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected ?string $alias = null;
 
//...
}

Также можно переопределить метод getAlias().

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function getAlias(): ?string
{
return 'custom_page';
}
 
//...
}
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function getAlias(): ?string
{
return 'custom_page';
}
 
//...
}

Рендеринг

Вы можете отображать страницу вне MoonShine, просто вернув ее в Контроллере

use MoonShine\Pages\Page;
 
class ProfileController extends Controller
{
public function __invoke(): Page
{
return ProfilePage::make();
}
}
use MoonShine\Pages\Page;
 
class ProfileController extends Controller
{
public function __invoke(): Page
{
return ProfilePage::make();
}
}

Или с Fortify

Fortify::loginView(static fn() => LoginPage::make());
Fortify::loginView(static fn() => LoginPage::make());

Перед рендерингом

Метод beforeRender() позволяет выполнить какие-либо действия перед отображением страницы.

use MoonShine\Models\MoonshineUserRole;
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function beforeRender(): void
{
if (auth()->user()->moonshine_user_role_id !== MoonshineUserRole::DEFAULT_ROLE_ID) {
abort(403);
}
}
}
use MoonShine\Models\MoonshineUserRole;
use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
public function beforeRender(): void
{
if (auth()->user()->moonshine_user_role_id !== MoonshineUserRole::DEFAULT_ROLE_ID) {
abort(403);
}
}
}