Основы
Вы просматриваете документацию старой версии 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; // ...}