Terug naar het blog

Hoe Maak en Gebruik Je Drupal 8+ Services: Een Gedetailleerde Gids met Praktische Code

2023-04-153 min leestijd

Drupal, het open-source content management systeem, heeft een lange weg afgelegd sinds de oprichting. Met de release van Drupal 8 zagen we een enorme verschuiving in de onderliggende architectuur: de adoptie van een meer objectgeoriënteerde programmeeraanpak met behulp van Symfony-componenten. Een opmerkelijke component die in Drupal 8 werd geïntroduceerd, is de servicecontainer, die sindsdien de manier waarop modules en thema's worden ontwikkeld heeft verbeterd.

Dit artikel geeft een diepgaande kijk op Drupal 8+ services en hoe deze kunnen worden gebruikt om efficiënte, modulaire en onderhoudbare code te creëren. Daarnaast lopen we door een voorbeeldcode voor een beter begrip.

Wat Zijn Drupal Services?

In Drupal 8+ zijn services herbruikbare componenten of objecten die specifieke functionaliteiten bieden. Ze zijn ontworpen om het Dependency Injection (DI) ontwerppatroon te volgen en worden meestal opgeslagen in de servicecontainer. Dit ontwerppatroon stelt je in staat om code met weinig koppeling te creëren, waardoor deze gemakkelijker te beheren en te onderhouden is.

Enkele voorbeelden van Drupal services zijn de Databaseverbinding, Entity Manager en Renderer.

Een Aangepaste Service Creëren

Om een aangepaste service in je module te bieden, moet je een services.yml bestand aanmaken in de hoofdmap van je module. Dit bestand wordt gebruikt om de klasse van je nieuwe service en eventuele afhankelijkheden te definiëren. Alle services worden aangemaakt als instanties van PHP-klassen.

Stap 1: Maak het services.yml Bestand

  1. Maak eerst een YAML-bestand met de naam jouwmodule.services.yml, waarbij je “jouwmodule” vervangt door de machinenaam van je module.
  2. Definieer de service in het YAML-bestand, inclusief de klasse en eventuele benodigde services.

Hier is een voorbeeld services.yml bestand:

services:
  jouwmodule.sample_service:
    class: Drupal\jouwmodule\SampleService
    arguments: ['@database']

Stap 2: Maak de Service Klasse

  1. Maak een nieuwe map aan op src binnen de hoofdmap van je module.
  2. Maak binnen de src map een PHP-bestand aan met dezelfde naam als de klasse die in het YAML-bestand is gedefinieerd. In ons voorbeeld zou dit SampleService.php zijn.
  3. Definieer de klasse in het nieuwe bestand, breid eventuele benodigde basisklassen uit en implementeer eventuele benodigde interfaces. Gebruik dependency injection om de klasse te construeren.

Hier is een voorbeeld SampleService.php bestand:

// Definieer de namespace voor deze klasse.
namespace Drupal\jouwmodule;

// Importeer de Drupal\Core\Database\Connection klasse zodat deze binnen deze klasse gebruikt kan worden.
use Drupal\Core\Database\Connection;

// Definieer een klasse genaamd SampleService.
class SampleService {

  // Definieer een eigenschap genaamd $database die binnen deze klasse toegankelijk is.
  protected $database;

  // Definieer een constructor methode die een Connection object ontvangt en toewijst aan de $database eigenschap.
  public function __construct(Connection $database) {
    $this->database = $database;
  }

  // Definieer een methode genaamd fetchAllUsers die alle gebruikers uit de 'users' tabel in de database ophaalt.
  public function fetchAllUsers() {
    // Maak een nieuwe select query op de 'users' tabel.
    $query = $this->database->select('users', 'u');

    // Selecteer de 'uid', 'name' en 'mail' velden uit de 'users' tabel.
    $query->fields('u', ['uid', 'name', 'mail']);

    // Voer de query uit en haal alle resultaten op als een associatieve array.
    return $query->execute()->fetchAll();
  }
}

In dit voorbeeld hebben we een eenvoudige aangepaste service gemaakt die alle gebruikers uit de database ophaalt. Zoals we kunnen zien, hebben we dependency injection gebruikt om de databaseverbinding in de service te injecteren.

Stap 3: Gebruik de Aangepaste Service

Het benaderen van je aangepaste service kan niet eenvoudiger. Gebruik in je module, thema of een andere service de \Drupal klasse om je aangepaste service aan te roepen, zoals hier:

$sample_service = \Drupal::service('jouwmodule.sample_service');
$all_users = $sample_service->fetchAllUsers();

En dat is alles! Je hebt succesvol een aangepaste service gemaakt in Drupal 8+.

Conclusie

Drupal 8+ services stellen ontwikkelaars in staat om schone, herbruikbare en goed afgebakende code te schrijven. Door aangepaste services te creëren en het Dependency Injection (DI) ontwerppatroon te gebruiken, kunnen ontwikkelaars efficiënt modulaire functies en verbeteringen aan Drupal-projecten implementeren.

Met een beter begrip van Drupal services en wat voorbeeldcode bij de hand, heb je nu de tools om je eigen aangepaste services te maken en de onderhoudbaarheid en modulariteit van je Drupal-projecten te verbeteren.