Create class

# Basics

Page is the basis of the MoonShine admin panel. The main purpose of Page is to display components.

Pages with the same logic can be combined into Resource.

# Creating a class

To create a page class, you can use the console command:

php artisan moonshine:page

After entering the name of the class, a file will be created, which is the basis for the page in the admin panel.
It is located by default in the app/MoonShine/Pages directory.

You can specify the name of the class and the directory of its location in the command.

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

The file OrderStatistics will be created in the app/MoonShine/Pages/Statistics directory.

# Heading

The page title can be set through the title property, and subtitle sets the subtitle.

use MoonShine\Pages\Page;
 
class CustomPage extends Page
{
protected string $title = 'CustomPage';
protected string $subtitle = 'Subtitle';
 
//...
}

If some logic is required for the title and subtitle, then the title() and subtitle() methods allow you to implement it.

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

# Components

The page is built from components, which can be both decorations and components of the admin panel itself, FormBuilder , TableBuilder , and just blade components, and even Livewire components.

To register page components, use the components() method.

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('Title 1', 'Text 1')
])
])->columnSpan(6),
Column::make([
Block::make([
TextBlock::make('Title 2', 'Text 2')
])
])->columnSpan(6),
])
];
}
 
//...
}

For more detailed information, please refer to the section Components .

The breadcrumbs() method is responsible for generating bread crumbs.

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

# Layout

By default, pages use a default Layout display template, but you can modify it through the layout property.

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

Layout can also be overridden using layout() method.

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

# Alias

If you need to change the page alias, this can be done through the alias property.

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

It is also possible to override the getAlias() method.

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

# Render

You can display the page outside of MoonShine by simply returning it to the Controller

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

Or with Fortify

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

# beforeRender

The beforeRender() method allows you to perform some actions before displaying the page.

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);
}
}
}