Основы
Handlers
в MoonShine - это переиспользуемые обработчики, которые позволяют легко добавлять пользовательские действия в ресурсы.
Основные преимущества:
- Не требуют создания контроллеров,
- Автоматическая обработка ошибок внутри MoonShine,
- Множество готовых методов для взаимодействия с системой,
- Простая интеграция с UI через автоматическую генерацию кнопок,
- После подключения автоматически отображаются в интерфейсе.
Создание Handler
Для создания нового Handler
используйте команду:
php artisan moonshine:handler MyCustomHandler
php artisan moonshine:handler MyCustomHandler
О всех поддерживаемых опциях можно узнать в разделе Команды.
После выполнения команды будет создан класс Handler
в директории app\MoonShine\Handlers
со следующей структурой:
namespace App\MoonShine\Handlers;use MoonShine\Contracts\UI\ActionButtonContract;use MoonShine\Laravel\Handlers\Handler;use MoonShine\Laravel\MoonShineUI;use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Exceptions\ActionButtonException;use Symfony\Component\HttpFoundation\Response;class MyCustomHandler extends Handler{/*** @throws ActionButtonException*/public function handle(): Response{if (! $this->hasResource()) {throw new ActionButtonException('Resource is required for action');}if ($this->isQueue()) {// Job hereMoonShineUI::toast(__('moonshine::ui.resource.queued'));return back();}self::process();return back();}public static function process(){// Logic here}public function getButton(): ActionButtonContract{return ActionButton::make($this->getLabel(), $this->getUrl());}}
namespace App\MoonShine\Handlers;use MoonShine\Contracts\UI\ActionButtonContract;use MoonShine\Laravel\Handlers\Handler;use MoonShine\Laravel\MoonShineUI;use MoonShine\UI\Components\ActionButton;use MoonShine\UI\Exceptions\ActionButtonException;use Symfony\Component\HttpFoundation\Response;class MyCustomHandler extends Handler{/*** @throws ActionButtonException*/public function handle(): Response{if (! $this->hasResource()) {throw new ActionButtonException('Resource is required for action');}if ($this->isQueue()) {// Job hereMoonShineUI::toast(__('moonshine::ui.resource.queued'));return back();}self::process();return back();}public static function process(){// Logic here}public function getButton(): ActionButtonContract{return ActionButton::make($this->getLabel(), $this->getUrl());}}
Регистрация
Для регистрации Handler
в ресурсе необходимо переопределить метод handlers()
:
class PostResource extends ModelResource{protected function handlers(): ListOf{return parent::handlers()->add(new MyCustomHandler());}}
class PostResource extends ModelResource{protected function handlers(): ListOf{return parent::handlers()->add(new MyCustomHandler());}}
После регистрации на индексной странице ресурса справа автоматически появится кнопка для запуска Handler
.
Взаимодействие
Handler
тесно интегрирован с ресурсом и имеет доступ к:
- Текущему ресурсу через
$this->getResource()
, - Возможностям запуска через очереди,
- Системе уведомлений и настройку пользователей, которые получат уведомления через
notifyUsers()
, - Модификация кнопки через
modifyButton()
.