Drupal 8 Services

As a developer, services are used to perform operations like accessing the database or sending an e-mail. Rather than use PHP's native MySQL functions, we use the core-provided service via the service container to perform this operation so that our code can simply access the database without having to worry about whether the database is MySQL or SQLlite, or if the mechanism for sending e-mail is SMTP or something else. path.alias_manager: class: Drupal\Core\Path\AliasManager arguments: ['@path.crud', '@path.alias_whitelist', '@language_manager'] language_manager: class: Drupal\Core\Language\LanguageManager arguments: ['@language.default']

Deze regels komen uit core.services.yml en definieren de path.alias_manager service. In de 'arguments:' regel worden de services opgesomt waarvan deze service afhankelijk is. Deze afhankelijkheid wordt aangegeven met '@'. Wanneer de path.alias_manager ergens wordt aangeroepen zorgt de service container ervoor dat de path.crud, de path.alias_whitelist en de language_manager services automatisch worden meegegeven aan de constructor van de path.alias_manager.

De language_manager op zijn beurt is weer afhankelijk van de language.default service.

Dependency Injection

Dit is een design pattern waarbij een klasse niet binnen een andere klasse wordt geinstatieerd maar als instantie wordt meegegeven aan de constructor van de afhankelijke klasse.

Een service container (of dependency injection container) is een PHP object die zorg draagt voor het instatieren van services. Drupal's service container is gebouwd op de Symfony 2 service container.

In Drupal 8 wordt het concept services geintroduceerd waarmee herbruikbare functionaliteit wordt losgekoppeld zodat deze services pluggable en vervangbaar worden. Hiervoor worden ze geregistreerd met een service container. Het is best practice voor developers om toegang tot de service via de service container te laten lopen zodat deze eigenschappen van kracht blijven.

De aanbevolen methode om services te benaderen in Drupal 8 is door gebruikmaking van dependency injection. Services moeten als argument worden doorgegeven aan een constructor of via setters worden geinjecteerd. Het is ook mgelijk de service te benaderen via een aanroep naar de global service container maar dit is af te raden. Dit moet alleen worden gedaan vanuit globale functies hetgeen vermeden dient te worden.

Het expliciet invoegen van services waar een object van afhankelijk is wordt dependency injection genoemd. Vaak worden deze afhankelijkheden via de constructors doorgegeven maar de service kan ook worden geinstantieerd door gebruikmaking van setter methodes.

Voor het opzetten van een nieuwe service in een module volg je de volgende stappen: