Основы
Handlers
в MoonShine - это переиспользуемые обработчики, которые позволяют легко добавлять пользовательские действия в ресурсы.
Основные преимущества:
- Не требуют создания контроллеров,
- Автоматическая обработка ошибок внутри MoonShine,
- Множество готовых методов для взаимодействия с системой,
- Простая интеграция с UI через автоматическую генерацию кнопок,
- После подключения автоматически отображаются в интерфейсе.
Создание Handler
Для создания нового Handler
используйте команду:
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 here MoonShineUI::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()); }}
После регистрации на индексной странице ресурса справа автоматически появится кнопка для запуска Handler
.
Взаимодействие
Handler
тесно интегрирован с ресурсом и имеет доступ к:
- Текущему ресурсу через
$this->getResource()
, - Возможностям запуска через очереди,
- Системе уведомлений и настройку пользователей, которые получат уведомления через
notifyUsers()
, - Модификация кнопки через
modifyButton()
.