82 lines
2.4 KiB
Markdown
82 lines
2.4 KiB
Markdown
|
---
|
|||
|
title: Experimenting with events in Drupal 8
|
|||
|
date: 2018-08-21
|
|||
|
excerpt: Trying a different way of structuring Drupal modules, using event subscribers and autowiring.
|
|||
|
tags:
|
|||
|
- drupal
|
|||
|
- drupal-8
|
|||
|
- drupal-planet
|
|||
|
- php
|
|||
|
- symfony
|
|||
|
promoted: true
|
|||
|
---
|
|||
|
|
|||
|
I’ve been experimenting with moving some code to Drupal 8, and I’m quite
|
|||
|
intrigued by a different way that I’ve tried to structure it - using event
|
|||
|
subscribers, building on some of the takeaways from Drupal Dev Days.
|
|||
|
|
|||
|
Here is how this module is currently structured:
|
|||
|
|
|||
|
![](/images/blog/events-drupal-8/1.png){.border .p-1}
|
|||
|
|
|||
|
Note that there is no `opdavies_blog.module` file, and rather than calling
|
|||
|
actions from within a hook like `opdavies_blog_entity_update()`, each action
|
|||
|
becomes it’s own event subscriber class.
|
|||
|
|
|||
|
This means that there are no long `hook_entity_update` functions, and instead
|
|||
|
there are descriptive, readable event subscriber class names, simpler action
|
|||
|
code that is responsibile only for performing one task, and you’re able to
|
|||
|
inject and autowire dependencies into the event subscriber classes as services -
|
|||
|
making it easier and cleaner to use dependency injection, and simpler write
|
|||
|
tests to mock dependencies when needed.
|
|||
|
|
|||
|
The additional events are provided by the
|
|||
|
[Hook Event Dispatcher module](https://www.drupal.org/project/hook_event_dispatcher).
|
|||
|
|
|||
|
## Code
|
|||
|
|
|||
|
`opdavies_blog.services.yml`:
|
|||
|
|
|||
|
```yaml
|
|||
|
services:
|
|||
|
Drupal\opdavies_blog\EventSubscriber\PostToMedium:
|
|||
|
autowire: true
|
|||
|
tags:
|
|||
|
- { name: event_subscriber }
|
|||
|
|
|||
|
Drupal\opdavies_blog\EventSubscriber\SendTweet:
|
|||
|
autowire: true
|
|||
|
tags:
|
|||
|
- { name: event_subscriber }
|
|||
|
```
|
|||
|
|
|||
|
<div class="note" markdown="1">
|
|||
|
Adding `autowire: true` is not required for the event subscriber to work. I’m using it to automatically inject any dependencies into the class rather than specifying them separately as arguments.
|
|||
|
</div>
|
|||
|
|
|||
|
`src/EventSubscriber/SendTweet.php`:
|
|||
|
|
|||
|
```php
|
|||
|
namespace Drupal\opdavies_blog\EventSubscriber;
|
|||
|
|
|||
|
use Drupal\hook_event_dispatcher\Event\Entity\EntityUpdateEvent;
|
|||
|
use Drupal\hook_event_dispatcher\HookEventDispatcherInterface;
|
|||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|||
|
|
|||
|
class SendTweet implements EventSubscriberInterface {
|
|||
|
|
|||
|
...
|
|||
|
|
|||
|
public static function getSubscribedEvents() {
|
|||
|
return [
|
|||
|
HookEventDispatcherInterface::ENTITY_UPDATE => 'sendTweet',
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
public function sendTweet(EntityUpdateEvent $event) {
|
|||
|
// Perform checks and send the tweet.
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
```
|