68publishers / event-dispatcher-extra
Extension that adds a combination of global and local event dispatchers with bridge into Nette Framework.
Requires
- php: ^7.3 || ^8.1
- symfony/event-dispatcher: ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.1
- mockery/mockery: ^1.4
- nette/bootstrap: ^3.0
- nette/di: ^3.0.3
- nette/tester: ^2.3.4
- roave/security-advisories: dev-master
Suggests
- nette/di: For an integration with Nette Framework.
Conflicts
- nette/di: <3.0
- nette/schema: <1.1
README
✨ Extension that adds a combination of global and local event dispatchers with bridge into Nette Framework. The global event dispatcher is the one that is registered as a service in DI Container. The local event dispatcher is a unique instance for each created object.
Installation
The best way to install 68publishers/event-dispatcher-extra is using Composer:
composer require 68publishers/event-dispatcher-extra
Integration into Nette Framework
All you need is register a compiler extension:
extensions: 68publishers.event_dispatcher_extra: SixtyEightPublishers\EventDispatcherExtra\Bridge\Nette\DI\EventDispatcherExtraExtension
The extension expects a service of type Symfony\Component\EventDispatcher\EventDispatcherInterface
in the DI Container
so you can use any integration of symfony/event-dispatcher
into the Nette Framework or you can simply register the service:
services: - type: Symfony\Component\EventDispatcher\EventDispatcher factory: Symfony\Component\EventDispatcher\EventDispatcher
Example usage
Service and factory:
<?php use Symfony\Contracts\EventDispatcher\Event; use SixtyEightPublishers\EventDispatcherExtra\EventDispatcherAwareTrait; use SixtyEightPublishers\EventDispatcherExtra\EventDispatcherAwareInterface; final class MyService implements EventDispatcherAwareInterface { use EventDispatcherAwareTrait; public function doSomething() : void { $this->getEventDispatcher()->dispatch(new Event(), 'something'); } } interface MyServiceFactoryInterface { public function create() : MyService; }
<?php /** @var MyServiceFactoryInterface $factory */ $service1 = $factory->create(); $service2 = $factory->create(); # attach a local event listener on specific instance: $service1->getEventDispatcher()->addListener('something', static function () { # do some stuff here }); # the "global" listeners and subscribers will be called as first and then will be called "local" listener defined above: $service1->doSomething(); # only the "global" listeners and subscribers will be called: $service2->doSomething();
Contributing
Before committing any changes, don't forget to run
$ vendor/bin/php-cs-fixer fix --config=.php_cs.dist -v --dry-run
and
$ composer run tests