Введение
MoonShine предоставляет гибкие возможности для конфигурации вашего приложения. В этом разделе мы рассмотрим два основных способа конфигурации и основные настройки.
Способы конфигурации
MoonShine можно настроить двумя способами:
- Через файл конфигурации
config/moonshine.php
- Через
MoonShineServiceProvider
с использованием классаMoonShineConfigurator
Конфигурация через файл moonshine.php
Файл config/moonshine.php
содержит все доступные настройки MoonShine. Вы можете изменять эти настройки напрямую в файле.
Пример содержимого файла moonshine.php
:
return ['title' => env('MOONSHINE_TITLE', 'MoonShine'),'logo' => '/assets/logo.png','logo_small' => '/assets/logo-small.svg','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,'use_profile' => true,'use_routes' => true,'domain' => env('MOONSHINE_DOMAIN'),'prefix' => 'admin','middleware' => [// ...],'auth' => ['enabled' => true,'guard' => 'moonshine','middleware' => Authenticate::class,// ...],'layout' => \MoonShine\Laravel\Layouts\AppLayout::class,'locale' => 'en','locales' => ['en', 'ru'],// ...];
return ['title' => env('MOONSHINE_TITLE', 'MoonShine'),'logo' => '/assets/logo.png','logo_small' => '/assets/logo-small.svg','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,'use_profile' => true,'use_routes' => true,'domain' => env('MOONSHINE_DOMAIN'),'prefix' => 'admin','middleware' => [// ...],'auth' => ['enabled' => true,'guard' => 'moonshine','middleware' => Authenticate::class,// ...],'layout' => \MoonShine\Laravel\Layouts\AppLayout::class,'locale' => 'en','locales' => ['en', 'ru'],// ...];
Частичная конфигурация
Альтернативно, вы можете оставить в файле moonshine.php
только те параметры, которые отличаются от значений по умолчанию.
Это делает конфигурацию более чистой и легкой для понимания.
Пример оптимизированного содержимого файла moonshine.php
:
return ['title' => 'My MoonShine Application','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,];
return ['title' => 'My MoonShine Application','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,];
use_migrations
, use_notifications
, use_database_notifications
должны присутствовать всегда либо в moonshine.php
, либо в MoonShineServiceProvider
.
Все остальные параметры, не указанные в файле, будут использовать значения по умолчанию.
Конфигурация через MoonShineServiceProvider
Альтернативный способ настройки - MoonShineServiceProvider
.
Этот метод предоставляет более программный подход к конфигурации.
Пример конфигурации в MoonShineServiceProvider
:
use Illuminate\Support\ServiceProvider;use MoonShine\Contracts\Core\DependencyInjection\CoreContract;use MoonShine\Laravel\DependencyInjection\MoonShine;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;use MoonShine\Laravel\DependencyInjection\ConfiguratorContract;class MoonShineServiceProvider extends ServiceProvider{/*** @param MoonShine $core* @param MoonShineConfigurator $config**/public function boot(CoreContract $core,ConfiguratorContract $config,): void{$config->title('My Application')->logo('/assets/logo.png')->logo('/assets/logo_small.png', true)->useMigrations()->useNotifications()->useDatabaseNotifications()->useProfile()->dir('app/MoonShine', 'App\MoonShine')->prefixes('admin', 'page', 'resource')->homeRoute('moonshine.index')->notFoundException(MoonShineNotFoundException::class)->middleware([// ...])->disk('public')->cacheDriver('redis')->authEnable()->guard('moonshine')->authMiddleware(Authenticate::class)->authPipelines([])->authorizationRules(function(ResourceContract $ctx, mixed $user, Ability $ability, mixed $data): bool {return true;})->layout(\App\MoonShine\Layouts\CustomLayout::class)->locale('ru')->locales(['en', 'ru']);// ...}}
use Illuminate\Support\ServiceProvider;use MoonShine\Contracts\Core\DependencyInjection\CoreContract;use MoonShine\Laravel\DependencyInjection\MoonShine;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;use MoonShine\Laravel\DependencyInjection\ConfiguratorContract;class MoonShineServiceProvider extends ServiceProvider{/*** @param MoonShine $core* @param MoonShineConfigurator $config**/public function boot(CoreContract $core,ConfiguratorContract $config,): void{$config->title('My Application')->logo('/assets/logo.png')->logo('/assets/logo_small.png', true)->useMigrations()->useNotifications()->useDatabaseNotifications()->useProfile()->dir('app/MoonShine', 'App\MoonShine')->prefixes('admin', 'page', 'resource')->homeRoute('moonshine.index')->notFoundException(MoonShineNotFoundException::class)->middleware([// ...])->disk('public')->cacheDriver('redis')->authEnable()->guard('moonshine')->authMiddleware(Authenticate::class)->authPipelines([])->authorizationRules(function(ResourceContract $ctx, mixed $user, Ability $ability, mixed $data): bool {return true;})->layout(\App\MoonShine\Layouts\CustomLayout::class)->locale('ru')->locales(['en', 'ru']);// ...}}
Конфигурация через MoonShineServiceProvider
имеет приоритет над настройками в файле moonshine.php
.
При использовании этого метода вы можете полностью удалить файл moonshine.php из вашего проекта.
Некоторые методы MoonShineConfigurator
не имеют прямых аналогов в файле moonshine.php
и наоборот.
Это связано с различиями в подходах к конфигурации через файл и через код.
Основные настройки
Независимо от выбранного способа конфигурации, вы можете настроить следующие основные параметры:
Опции
use_migrations
- использовать публикацию миграций системы по умолчанию (moonshine_users
,moonshine_user_roles
),use_notifications
- использовать систему уведомлений,use_database_notifications
- использовать систему уведомлений Laravel на основе драйвера базы данных,dir
- директория для MoonShine (по умолчаниюapp/MoonShine
). Директория используется для генерации файлов черезartisan
команды, в целом MoonShine не привязан к структуре,namespace
- namespace для классов созданных черезartisan
команды (по умолчаниюApp\MoonShine
).
'dir' => 'app/MoonShine','namespace' => 'App\MoonShine','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,
'dir' => 'app/MoonShine','namespace' => 'App\MoonShine','use_migrations' => true,'use_notifications' => true,'use_database_notifications' => true,
$config->dir(dir: 'app/MoonShine', namespace: 'App\MoonShine')->useMigrations()->useNotifications()->useDatabaseNotifications();
$config->dir(dir: 'app/MoonShine', namespace: 'App\MoonShine')->useMigrations()->useNotifications()->useDatabaseNotifications();
Заголовок
Мета заголовок на страницах (<title>My Application</title>
).
'title' => 'My Application',
'title' => 'My Application',
$config->title('My Application');
$config->title('My Application');
Логотип
'logo' => '/assets/logo.png','logo_small' => '/assets/logo-small.png',
'logo' => '/assets/logo.png','logo_small' => '/assets/logo-small.png',
$config->logo('/assets/logo.png')->logo('/assets/logo-small.png', small: true);
$config->logo('/assets/logo.png')->logo('/assets/logo-small.png', small: true);
Middleware
Вы можете переопределить или дополнить список middleware
в системе.
'middleware' => ['web','auth',// ...],
'middleware' => ['web','auth',// ...],
$config->middleware(['web', 'auth'])->addMiddleware('custom-middleware')->exceptMiddleware(['auth']);
$config->middleware(['web', 'auth'])->addMiddleware('custom-middleware')->exceptMiddleware(['auth']);
Маршрутизация
Установка префиксов
'prefix' => 'admin','page_prefix' => 'page','resource_prefix' => 'resource',
'prefix' => 'admin','page_prefix' => 'page','resource_prefix' => 'resource',
$config->prefixes('admin', 'page', 'resource');
$config->prefixes('admin', 'page', 'resource');
Вы можете оставить resource_prefix
пустым и URL
ресурсов будет иметь вид /admin/{resourceUri}/{pageUri}
,
но вы можете создать конфликт с роутами пакетов.
Установка домена
'domain' => 'admin.example.com',
'domain' => 'admin.example.com',
$config->domain('admin.example.com');
$config->domain('admin.example.com');
404
Вы можете заменить Exception
на собственный.
'not_found_exception' => MoonShineNotFoundException::class,
'not_found_exception' => MoonShineNotFoundException::class,
$config->notFoundException(MoonShineNotFoundException::class);
$config->notFoundException(MoonShineNotFoundException::class);
Аутентификация
Установка guard
'auth' => ['guard' => 'admin',// ...],
'auth' => ['guard' => 'admin',// ...],
$config->guard('admin');
$config->guard('admin');
Отключение встроенной аутентификации
'auth' => ['enabled' => false,// ...],
'auth' => ['enabled' => false,// ...],
$config->authDisable();
$config->authDisable();
Изменение модели
'auth' => [// ...'model' => User::class,// ...],
'auth' => [// ...'model' => User::class,// ...],
Указывается при инициализации приложения, поэтому указывается исключительно через файл конфигурации.
Middleware для проверки наличия сессии
'auth' => [// ...'middleware' => Authenticate::class,// ...],
'auth' => [// ...'middleware' => Authenticate::class,// ...],
$config->authMiddleware(Authenticate::class);
$config->authMiddleware(Authenticate::class);
Pipelines
'auth' => [// ...'pipelines' => [TwoFactor::class],// ...],
'auth' => [// ...'pipelines' => [TwoFactor::class],// ...],
$config->authPipelines([TwoFactor::class]);
$config->authPipelines([TwoFactor::class]);
Поля пользователя
Если вы просто заменили модель на свою auth.model
, то скорее всего вы столкнетесь с проблемой несоответствия наименования полей.
Чтобы настроить соответствие, воспользуйтесь настройкой userField()
.
'user_fields' => ['username' => 'email','password' => 'password','name' => 'name','avatar' => 'avatar',],
'user_fields' => ['username' => 'email','password' => 'password','name' => 'name','avatar' => 'avatar',],
$config->userField('username', 'username');
$config->userField('username', 'username');
Локализация
Язык по умолчанию
'locale' => 'en',
'locale' => 'en',
$config->locale('en');
$config->locale('en');
Установка доступных языков
'locales' => ['en', 'ru'],
'locales' => ['en', 'ru'],
$config->locales(['en', 'ru']);
$config->locales(['en', 'ru']);
Изменение имени параметра
'locale_key' => '_lang',
'locale_key' => '_lang',
$config->localeKey('_lang');
$config->localeKey('_lang');
Подробнее смотрите в разделе локализация.
Хранилище
Storage
'disk' => 'public','disk_options' => [],
'disk' => 'public','disk_options' => [],
$config->disk('public', options: []);
$config->disk('public', options: []);
Cache
'cache' => 'file',
'cache' => 'file',
$config->cacheDriver('redis');
$config->cacheDriver('redis');
Layout
Шаблон используемый по умолчанию.
'layout' => \App\MoonShine\Layouts\CustomLayout::class,
'layout' => \App\MoonShine\Layouts\CustomLayout::class,
$config->layout(\App\MoonShine\Layouts\CustomLayout::class);
$config->layout(\App\MoonShine\Layouts\CustomLayout::class);
Формы
Для удобства мы вынесли формы аутентификации и фильтров в конфигурацию и даем быстрый способ их заменить на собственные.
'forms' => ['login' => LoginForm::class,'filters' => FiltersForm::class,],
'forms' => ['login' => LoginForm::class,'filters' => FiltersForm::class,],
$config->set('forms.login', MyLoginForm::class);
$config->set('forms.login', MyLoginForm::class);
Страницы
Для удобства мы вынесли базовые страницы в конфигурацию и даем быстрый способ их заменить на собственные.
'pages' => ['dashboard' => Dashboard::class,'profile' => ProfilePage::class,'login' => LoginPage::class,'error' => ErrorPage::class,],
'pages' => ['dashboard' => Dashboard::class,'profile' => ProfilePage::class,'login' => LoginPage::class,'error' => ErrorPage::class,],
$config->changePage(LoginPage::class, MyLoginPage::class);
$config->changePage(LoginPage::class, MyLoginPage::class);
Главная страница
Вы можете указать какой роут или урл является главной страницей панели. Используется при редиректе после успешной аутентификации, ссылке на логотипе и 404 странице.
'home_route' => 'moonshine.index',// or url string'home_url' => '/admin/page/some-page',
'home_route' => 'moonshine.index',// or url string'home_url' => '/admin/page/some-page',
$config->homeRoute('moonshine.index');// or url string$config->homeUrl('/admin/page/some-page');
$config->homeRoute('moonshine.index');// or url string$config->homeUrl('/admin/page/some-page');
Получение страниц и форм
MoonShine предоставляет удобные методы для получения страниц и форм в вашем приложении.
Получение страниц
Метод getPage
позволяет получить экземпляр страницы по её имени или использовать страницу по умолчанию.
getPage(string $name,string $default,mixed ...$parameters,)
getPage(string $name,string $default,mixed ...$parameters,)
Параметры:
$name
- имя страницы в конфиге,$default
- класс страницы по умолчанию, если не найдена в конфиге,$parameters
- дополнительные параметры для конструктора страницы.
Пример использования:
// Helper$customPage = moonshineConfig()->getPage('custom');
// Helper$customPage = moonshineConfig()->getPage('custom');
// DIuse MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;/*** @param MoonShineConfigurator $configurator*/public function index(ConfiguratorContract $config){$customPage = $config->getPage('custom');}
// DIuse MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;/*** @param MoonShineConfigurator $configurator*/public function index(ConfiguratorContract $config){$customPage = $config->getPage('custom');}
Получение форм
Метод getForm
позволяет получить экземпляр формы по её имени или использовать форму по умолчанию.
getForm(string $name,string $default,mixed ...$parameters,)
getForm(string $name,string $default,mixed ...$parameters,)
Параметры:
$name
- имя формы в конфиге,$default
- класс формы по умолчанию,$parameters
- дополнительные параметры для конструктора формы.
Пример использования:
// Helper$form = moonshineConfig()->getForm('login');
// Helper$form = moonshineConfig()->getForm('login');
// DIuse MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;/*** @param MoonShineConfigurator $configurator*/public function index(ConfiguratorContract $config){$form = $config->getForm('login');}
// DIuse MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract;use MoonShine\Laravel\DependencyInjection\MoonShineConfigurator;/*** @param MoonShineConfigurator $configurator*/public function index(ConfiguratorContract $config){$form = $config->getForm('login');}
Объявление страниц и форм в конфигурации
Вы можете настроить соответствие между именами и классами страниц и форм в файле moonshine.php
.
return [// Другие настройки...'pages' => ['dashboard' => \App\MoonShine\Pages\DashboardPage::class,'custom' => \App\MoonShine\Pages\CustomPage::class,],'forms' => ['login' => \App\MoonShine\Forms\LoginForm::class,'custom' => \App\MoonShine\Forms\CustomForm::class,],];
return [// Другие настройки...'pages' => ['dashboard' => \App\MoonShine\Pages\DashboardPage::class,'custom' => \App\MoonShine\Pages\CustomPage::class,],'forms' => ['login' => \App\MoonShine\Forms\LoginForm::class,'custom' => \App\MoonShine\Forms\CustomForm::class,],];
Это позволит вам легко получать нужные страницы и формы по их именам, используя методы getPage
и getForm
.
Выбор метода конфигурации
При выборе метода конфигурации важно учитывать следующее:
-
Приоритет: Конфигурация через
MoonShineServiceProvider
имеет приоритет над настройками в файлеmoonshine.php
. -
Гибкость:
- Полная конфигурация через
moonshine.php
дает четкий обзор всех настроек, - Частичная конфигурация через
moonshine.php
позволяет легко видеть, какие параметры были изменены, - Конфигурация через
MoonShineServiceProvider
предоставляет максимальную гибкость и возможность использовать логику при настройке.
- Полная конфигурация через
-
Простота поддержки:
- Использование файла
moonshine.php
может быть проще для быстрых изменений и понимания общей структуры настроек, MoonShineServiceProvider
позволяет централизованно управлять настройками в одном месте в коде.
- Использование файла
-
Интеграция с кодом:
- Конфигурация через
MoonShineServiceProvider
лучше интегрируется с остальным кодом приложения и позволяет использовать зависимости и сервисы Laravel.
- Конфигурация через
Выберите метод, который лучше всего соответствует вашему стилю разработки и требованиям проекта.
Вы также можете комбинировать эти подходы, например, используя файл moonshine.php
для базовых настроек и MoonShineServiceProvider
для более сложной конфигурации.