Registering Handlers
How to register and manage extension handlers
Basic Registration
Register handlers in a service provider:
use Esegments\LaravelExtensions\Facades\Extensions;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Extensions::register(
UserCreated::class, // Extension point
SendWelcomeEmail::class, // Handler
priority: 10 // Optional priority
);
}
}
Handler Contract
Handlers must implement ExtensionHandlerContract:
use Esegments\LaravelExtensions\Contracts\ExtensionHandlerContract;
use Esegments\LaravelExtensions\Contracts\ExtensionPointContract;
class SendWelcomeEmail implements ExtensionHandlerContract
{
public function handle(ExtensionPointContract $extension): void
{
Mail::to($extension->user->email)
->send(new WelcomeEmail($extension->user));
}
}
Type-Hinted Handlers
For better IDE support, type-hint the specific extension:
class SendWelcomeEmail implements ExtensionHandlerContract
{
public function handle(UserCreated $extension): void
{
// Full autocompletion for $extension->user
Mail::to($extension->user->email)
->send(new WelcomeEmail($extension->user));
}
}
Closure Handlers
For simple handlers, use closures:
Extensions::register(UserCreated::class, function (UserCreated $extension) {
Log::info('User created', ['user_id' => $extension->user->id]);
});
Dependency Injection
Handlers are resolved from the container:
class SendWelcomeEmail implements ExtensionHandlerContract
{
public function __construct(
private readonly Mailer $mailer,
private readonly UserRepository $users
) {}
public function handle(UserCreated $extension): void
{
$this->mailer->send(
new WelcomeEmail($extension->user)
);
}
}
Registration Methods
Single Handler
Extensions::register(UserCreated::class, SendWelcomeEmail::class);
With Priority
Extensions::register(UserCreated::class, SendWelcomeEmail::class, priority: 10);
With Tags
Extensions::registerWithTags(
UserCreated::class,
SendWelcomeEmail::class,
priority: 10,
tags: ['notifications', 'email']
);
Multiple Handlers at Once
Extensions::registerMany([
[UserCreated::class, SendWelcomeEmail::class, 10],
[UserCreated::class, CreateProfile::class, 20],
[UserCreated::class, TrackAnalytics::class, 100],
]);
Handler Groups
Extensions::registerGroup('user-notifications', [
[UserCreated::class, SendWelcomeEmail::class, 10],
[UserUpdated::class, SendProfileUpdateEmail::class, 10],
[PasswordReset::class, SendPasswordResetEmail::class, 10],
]);
// Later, disable entire group
Extensions::disableGroup('user-notifications');
Removing Handlers
// Remove specific handler
Extensions::unregister(UserCreated::class, SendWelcomeEmail::class);
// Remove all handlers for extension point
Extensions::unregisterAll(UserCreated::class);
Checking Registration
// Check if extension point has any handlers
Extensions::hasHandlers(UserCreated::class);
// Count handlers
Extensions::countHandlers(UserCreated::class);
// Get all handlers for extension point
Extensions::getHandlers(UserCreated::class);
// Get all registered extension points
Extensions::getRegisteredExtensionPoints();
Handler Return Values
By default, handler return values are ignored:
public function handle(UserCreated $extension): void
{
// Return value ignored
}
To use return values, see Strategies.
Handler Ordering
Handlers execute by priority (lower numbers first):
Extensions::register(OrderPlaced::class, ValidateStock::class, priority: 10);
Extensions::register(OrderPlaced::class, ProcessPayment::class, priority: 20);
Extensions::register(OrderPlaced::class, UpdateInventory::class, priority: 30);
Extensions::register(OrderPlaced::class, SendConfirmation::class, priority: 100);
Execution order: ValidateStock → ProcessPayment → UpdateInventory → SendConfirmation