symfony/event-dispatcher-contracts
Defines lightweight, version-stable contracts for Symfony’s EventDispatcher: interfaces and abstractions shared across components. Use it to type-hint and build compatible event dispatching integrations with proven Symfony semantics without pulling full implementations.
Event class already extends Symfony’s Event, so the primary value lies in dispatcher abstraction rather than event definitions.Illuminate\Events) is not PSR-14-compliant, creating a mismatch between event contracts and dispatching logic. This requires a bridge (e.g., spatie/laravel-psr-event-dispatcher) to fully leverage PSR-14.Illuminate\Events.use Illuminate\Contracts\Events\Dispatcher with PSR-14 interfaces in event classes. Zero runtime impact if using Laravel’s dispatcher.spatie/laravel-psr-event-dispatcher) to translate between Laravel’s and PSR-14 dispatchers.ListenerProvider or EventDispatcherInterface.make:event does not generate PSR-14-compliant classes by default, necessitating custom templates or post-generation scripts.handle() to __invoke() for PSR-14 compliance.ListenerProvider.Event::fake()), and debugging.EventServiceProvider bindings) adapt to PSR-14’s ListenerProvider or EventDispatcherInterface?Event class or Illuminate\Events APIs?Event::fake())? Custom test doubles may be required for PSR-14.symfony/event-dispatcher as the primary dispatcher).Illuminate\Events.Event class already extends Symfony’s Event, so event definitions can be PSR-14-compliant without changes.Illuminate\Events) is the primary integration challenge.Phase 1: Event Definitions (Low Risk, High Reward)
Symfony\Contracts\EventDispatcher\Event or implement EventInterface.// Before (Laravel-specific)
class UserRegistered implements ShouldBroadcast {
use Dispatchable, SerializesModels;
public User $user;
}
// After (PSR-14 compliant)
class UserRegistered extends \Symfony\Contracts\EventDispatcher\Event {
public function __construct(public User $user) {}
}
make:event template or post-class script to enforce PSR-14 compliance.Phase 2: Dispatcher Integration (High Risk, Strategic Decision)
Event facade but use PSR-14-compliant event classes.event(new UserRegistered($user)); // Works with Laravel’s dispatcher
symfony/event-dispatcher via spatie/laravel-psr-event-dispatcher).composer require spatie/laravel-psr-event-dispatcher.EventServiceProvider to register listeners using ListenerProvider or EventDispatcherInterface.event() calls with PSR-14’s dispatch() where needed.Phase 3: Listener Migration (Moderate Risk)
__invoke() method instead of handle().// Before (Laravel)
public function handle(UserRegistered $event) { ... }
// After (PSR-14)
public function __invoke(UserRegistered $event) { ... }
EventServiceProvider bindings or third-party listener registrations.Phase 4: Testing and Validation
__invoke() signatures).Event::fake() if using Laravel’s testing helpers.Event class or Illuminate\Events APIs.ShouldBroadcast or Dispatchable traits may need updates.symfony/event-dispatcher or other PSR-14-compliant dispatchersHow can I help you explore Laravel packages today?