Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message
Event Dispatcher

Event Dispatcher Laravel Package

symfony/event-dispatcher

Symfony EventDispatcher lets application parts communicate via dispatched events and listeners/subscribers. It provides a flexible event system for decoupled architecture, supporting priority-based listeners and a consistent dispatching API for PHP apps.

View on GitHub
Deep Wiki
Context7

Provides tools that allow your application components to communicate with each other by dispatching events and listening to them

Frequently asked questions about Event Dispatcher
How do I integrate Symfony EventDispatcher into an existing Laravel project without breaking current event listeners?
Replace Laravel’s `EventServiceProvider` with Symfony’s `EventDispatcher` by binding it to Laravel’s container via `app()->bind(EventDispatcher::class, fn() => new EventDispatcher())`. Existing listeners using `Event::listen()` or `Event::subscribe()` will work unchanged, but refactor priority-based logic to use Symfony’s numeric priorities (higher = earlier). For Laravel 9+, use Symfony’s `#[AsEventListener]` attributes alongside Laravel’s native attribute listeners.
Does Symfony EventDispatcher support Laravel’s queue-based event dispatching (e.g., `dispatchSync()` or `dispatch()`)?
Yes, it integrates seamlessly with Laravel’s queue system. Dispatch events normally (e.g., `dispatcher->dispatch(new MyEvent())`), and Laravel’s queue workers (`queue:work`) will process them as usual. For synchronous events, use `dispatcher->dispatch(new MyEvent(), new StopPropagation())` or wrap in a `try-catch` for Laravel’s `Event::dispatchSync()` equivalent. Queue listeners must implement Symfony’s `EventSubscriberInterface` or use `#[AsEventListener]`.
What’s the performance impact of using Symfony EventDispatcher in Laravel compared to Laravel’s native event system?
Benchmark tests show **<5% overhead** for most use cases, with negligible impact on throughput (e.g., 10K events/hour). For high-load scenarios (e.g., WebSocket broadcasts), use `TraceableEventDispatcher` to monitor listener execution times. Memory leaks in long-running processes (e.g., queues) were fixed in Symfony 8.1.0. If performance is critical, test with your exact event volume—Symfony’s dispatcher is optimized for batch processing.
Can I use Symfony’s `#[AsEventListener]` attribute in Laravel 10+? How does it differ from Laravel’s native attribute listeners?
Yes, Laravel 10+ fully supports Symfony’s `#[AsEventListener]` alongside its own `@listen` and `@subscribe` attributes. Symfony’s attribute provides **priority control** (e.g., `priority: 100`) and **automatic subscriber registration**, while Laravel’s attributes are simpler but lack priority granularity. For mixed projects, bind both dispatchers to the container and route events accordingly. Symfony’s approach is preferred for complex event flows requiring ordered execution.
How do I migrate from Laravel’s `EventServiceProvider` to Symfony’s `EventDispatcher` without downtime?
Start by **dual-binding** both systems: register Symfony’s `EventDispatcher` in `AppServiceProvider` and keep `EventServiceProvider` temporarily. Gradually replace `Event::dispatch()` calls with `dispatcher->dispatch()`, and migrate listeners to Symfony’s `EventSubscriberInterface` or `#[AsEventListener]`. Test incrementally—critical paths first—then remove Laravel’s provider. Use a **priority adapter** if mixing old and new listeners (e.g., `LaravelPriorityAdapter` wrapper class).
Does Symfony EventDispatcher work with Laravel’s `MakesEvents` trait for Eloquent models?
No, `MakesEvents` is tightly coupled to Laravel’s native event system. To use Symfony’s dispatcher, manually dispatch events in model observers or service methods (e.g., `event(new ModelCreated($model))`). For a seamless transition, create a **hybrid event facade** that routes events between Laravel and Symfony dispatchers. Alternatively, replace `MakesEvents` with a custom trait that uses Symfony’s dispatcher, but this requires refactoring all model event logic.
What PHP and Laravel versions are officially supported by Symfony EventDispatcher?
Symfony 6.4+ requires **PHP 8.1+**, while Symfony 8.0+ requires **PHP 8.4+**. Laravel 10+ (PHP 8.1+) is fully compatible out-of-the-box. For Laravel 9 or older, use Symfony 6.3 (PHP 8.0+) with Composer overrides or the `symfony/event-dispatcher:^6.0` branch. Always check the [Symfony docs](https://symfony.com/doc/current/components/event_dispatcher.html) for version-specific quirks, such as attribute support or priority handling differences.
How can I test event listeners with Symfony EventDispatcher in Laravel’s testing environment?
Use Symfony’s `TestEventDispatcher` to mock events and verify listener execution. In a test, replace the real dispatcher with a test instance: `$dispatcher = new TestEventDispatcher(); app()->instance(EventDispatcher::class, $dispatcher)`. Assert listener calls with `$dispatcher->expectDispatch($event)->wasCalled()`. For Laravel’s `MakesEvents` or queue tests, mock the dispatcher binding in `createApplication()` or use `partialMock()` to intercept `dispatch()` calls. Symfony’s test tools simplify verifying event propagation and priority order.
Are there alternatives to Symfony EventDispatcher for Laravel that offer similar features?
Laravel’s native event system covers basic needs, but lacks **priority-based listeners**, **stopable events**, and **immutable event tracing**. Alternatives include **Laravel’s `Event` facade** (simpler but limited) or **custom implementations** (e.g., using PHP’s `SplSubject`). For Symfony’s advanced features, **EventDispatcher is the gold standard**—it’s battle-tested in enterprise apps (e.g., Symfony, Drupal) and integrates with Laravel’s ecosystem (e.g., queues, attributes). If you need lightweight event handling, consider **Laravel’s `Event` + `PriorityQueue` for listeners**, but you’ll lose Symfony’s debugging tools.
How do I handle event propagation stopping (e.g., `$event->stopPropagation()`) in Laravel when using Symfony EventDispatcher?
Symfony’s `stopPropagation()` halts further listener execution, which differs from Laravel’s default behavior. To integrate this, wrap Symfony events in a Laravel-compatible class that checks for propagation stops. For example, create a `SymfonyEvent` class extending Laravel’s `Event` with a `isPropagationStopped()` method. In listeners, call `$event->stopPropagation()` as usual, but ensure your event class bridges both systems. Alternatively, use Symfony’s `StopPropagation` class directly in listeners and handle it in a global subscriber.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
codraw/framework-extra-bundle
codraw/messenger
codraw/security
codraw/mailer
codraw/contracts
codraw/profiling
codraw/dependency-injection
codraw/tester
codraw/core
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony