Basics
Handlers
in MoonShine
are reusable handlers that allow you to easily add custom actions to resources.
The main advantages:
- Do not require the creation of controllers
- Automatic error handling within
MoonShine
- Many ready-made methods for interaction with the system
- Simple integration with
UI
through automatic button generation - Automatically displayed in the interface after connection
Creating Handler
To create a new Handler
, use the command:
php artisan moonshine:handler MyCustomHandler
After executing the command, a Handler
class will be created in the app\MoonShine\Handlers
directory with the following structure:
<?php declare(strict_types=1); namespace App\MoonShine\Handlers; use MoonShine\UI\Exceptions\ActionButtonException;use MoonShine\Laravel\MoonShineUI;use MoonShine\Laravel\Handlers\Handler;use MoonShine\Contracts\UI\ActionButtonContract;use MoonShine\UI\Components\ActionButton;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()); }}
Registration
To register a Handler
in a resource, you need to override the handlers()
method:
class PostResource extends ModelResource{ protected function handlers(): ListOf { return parent::handlers()->add(new MyCustomHandler()); }}
After registration, a button for launching the Handler
will automatically appear on the right side of the resource's index page.
Interaction
Handler
is closely integrated with the resource and has access to:
- The current resource via
$this->getResource()
- Queueing capabilities
- Notification system and settings for users who will receive notifications via
notifyUsers()
- Modifying the button via
modifyButton()