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 => 'coll',
];
}
public function happy(HappyEvent $event): void {}
public function coll(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|AnotherEvent $event): void {}
}
or SRP 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 (0)