Основы

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

# Основы

Что есть административная панель? Само собой это разделы, основанные на данных из базы, на основе eloquent моделей.

В основе MoonShine стандартные Laravel ресурс контроллеры и ресурс роуты

php artisan make:controller Controller --resource
Route::resources('resources', Controller::class);
Но система будет их генерировать и объявлять самостоятельно.

Поэтому в основе ресурсов MoonShine (разделов админ-панели) eloquent модель.

# Создание раздела админ-панели

php artisan moonshine:resource Post

В результате будет создан Resource класс, который будет основой нового раздела в панели. Располагается он по умолчанию в директории app/MoonShine/Resources/PostResource. И будет автоматически привязан к модели app/Models/Post. Заголовок раздела останется с названием Posts.

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

php artisan moonshine:resource Post --model=CustomPost --title="Статьи"
php artisan moonshine:resource Post --model="App\Models\CustomPost" --title="Статьи"

# Основные свойства раздела

Основные параметры, которые можно менять у ресурса, чтобы кастомизировать его работу

namespace MoonShine\Resources;
 
use MoonShine\Models\MoonshineUser;
 
class PostResource extends Resource
{
public static string $model = App\Models\Post::class; // Модель
 
public static string $title = 'Статьи'; // Название раздела
 
public static string $subTitle = 'Управление статьями'; // Текст под заголовком раздела
 
public static array $with = ['category']; // Eager load
 
public static bool $withPolicy = false; // Авторизация
 
public static string $orderField = 'id'; // Поле сортировки по умолчанию
 
public static string $orderType = 'DESC'; // Тип сортировки по умолчанию
 
public static int $itemsPerPage = 25; // Количество элементов на странице
 
//...
}

# Объявление раздела в системе

Добавляются новые ресурсы к системе в service provider с помощью singleton класса MoonShine\MoonShine.

namespace App\Providers;
 
use App\MoonShine\Resources\PostResource;
 
class MoonShineServiceProvider extends ServiceProvider
{
//...
 
public function boot()
{
app(MoonShine::class)->resources([
new PostResource(),
])
}

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

namespace App\Providers;
 
use App\MoonShine\Resources\PostResource;
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()),
MenuItem::make('Posts', new PostResource()),
]);
}
}

О расширенных настройках можно узнать в разделе Digging Deeper > Меню .

# Текущий элемент/модель

В ресурсе вы имеете доступ к текущему элементу и модели через соответствующие методы.

$this->getItem();
$this->getModel();

Если элемента еще не существует (action create), то метод getItem() вернет NULL.

Возможность добавлять, редактировать и просматривать записи прямо на странице со списком в модальном окне.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
 
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
public static string $title = 'Posts';
 
protected bool $createInModal = true;
 
protected bool $editInModal = true;
 
protected bool $showInModal = true;
 
// ...

# Переход после сохранения

После сохранения ресурса можно указать, по какому маршруту сделать переход: на страницу списка, детальную страницу или же на страницу редактирования.

По умолчанию index

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
protected string $routeAfterSave = 'index'; // index, show, edit
 
// ...
}

# Simple pagination

Если вы не планируете отображать общее количество страниц, воспользуйтесь Simple Pagination. Это позволит избежать дополнительных запросов на общее количество записей в базе данных.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
public static bool $simplePaginate = true;
 
// ...
}

# Отключение пагинации

Если вы не планируете использовать разбиение на страницы, то его можно отключить.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
protected bool $usePagination = false;
 
// ...
}

# Кастомизация отображений

Можно кастомизировать отображение списка и формы через свойства itemsView, formView и detailView.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
protected string $itemsView = 'moonshine::crud.shared.table';
 
protected string $formView = 'moonshine::crud.shared.form';
 
protected string $detailView = 'moonshine::crud.shared.detail-card';
 
// ...
}

Или переопределив соответствующие методы

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
public function itemsView(): string
{
return $this->itemsView;
}
 
public function formView(): string
{
return $this->formView;
}
 
public function detailView(): string
{
return $this->detailView;
}
 
// ...
}

# Precognition

Precognition в Laravel позволяет создавать "живую" проверку для вашего приложения без необходимости дублировать правила валидации.

В Moonshine вы можете воспользоваться precognition при отправке запросов вашего ресурса. Для этого необходимо у свойства precognition указать значение true.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Resources\Resource;
 
class PostResource extends Resource
{
public static string $model = Post::class;
 
protected bool $precognition = true;
 
// ...
}