Do you like Symfony\Component\EventDispatcher\EventSubscriberInterface and it's getSubscribedEvents() method?
class AwesomeSubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
HappyEvent::class => 'happy',
CoolEvent::class => 'cool',
];
}
public function happy(HappyEvent $event): void {}
public function cool(CoolEvent $event): void {}
}
I hate it!
- Array with textual method name representation
- Event class-name written multiple times 😑
Yes, new Symfony has attribute #[AsEventListener], but what if you use another framework or older version of event-dispatcher or you don't like attributes?
There is simple solution 💥
See this trait https://github.com/Zarganwar/symfony-event-dispatcher-utils.
That provides you with a simple (automatic) way to subscribe to events to __invoke method.
class AwesomeSubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
use AutoEventSubscriberTrait; // <<<--- This is it! ❤️
public function __invoke(HappyEvent|CoolEvent $event): void {}
}
or subscriber per event
class HappySubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
use AutoEventSubscriberTrait;
public function __invoke(HappyEvent $event): void {}
}
class CoolSubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
use AutoEventSubscriberTrait;
public function __invoke(CoolEvent $event): void {}
}
Of course, you can use interfaces and union types.
Go to https://github.com/Zarganwar/symfony-event-dispatcher-utils and install
composer require zarganwar/symfony-event-dispatcher-utils
Enjoy! 🎉
Top comments (4)
Hello. Why don't you use AsEventListener attribute ?
Hi, the attribute is great, but when is event-dispatcher used in a different framework, it’s not as easy to implement. This is a simple alternative. But it is not bad idea, to use the Attribute inside too.
What about the event priority?
Yes, I was thinking about it, but it wasn’t essential for my use so far. It can be add it in the future. 👍