Основы
Handlers в MoonShine - это переиспользуемые обработчики, которые позволяют легко добавлять пользовательские действия в ресурсы.
Основные преимущества:
- Не требуют создания контроллеров,
- Автоматическая обработка ошибок внутри MoonShine,
- Множество готовых методов для взаимодействия с системой,
- Простая интеграция с UI через автоматическую генерацию кнопок,
- После подключения автоматически отображаются в интерфейсе.
Создание Handler
Для создания нового Handler используйте команду:
php artisan moonshine:handler MyCustomHandlerphp 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().