This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
oliverdavies.uk-old-sculpin/source/_posts/2018-08-21-add-all-the-events-in-drupal-8.md
2018-08-22 07:31:56 +01:00

69 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Experimenting with events in Drupal 8
tags:
- drupal
- drupal-8
- symfony
- php
---
{% block excerpt %}
Ive been experiementing with moving some of the code to Drupal 8, and Im quite intrigued by a different way that Ive tried to structure it - building on some of the takeaways from Drupal Dev Days.
{% endblock %}
{% block content %}
Here is how this module is currently structured:
![](/assets/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 its 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 youre 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][0].
## 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 }
```
`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.
}
}
```
{% endblock %}
[0]: https://www.drupal.org/project/hook_event_dispatcher