Drupal 9: Como registrar um serviço

Por Fernando Katsukawa, 16 Novembro, 2022

Isso também deve funcionar para Drupal 8 ou Drupal 10.

No Drupal, a partir da versão 8, um serviço pode ser registrado e utilizado chamando o container de serviços.

Os serviços costumam ser usados para ajudar o Drupal e o projeto em si desacoplando e reutilizando funcionalidades.

Os serviços são definidos no arquivo .services.yml do módulo, como no core, em core.services.yml

Assim, para cadastrar um serviço customizado em seu módulo customizado, basta criar um arquivo utilizando o padrão abaixo e colocá-lo na pasta raiz do seu módulo customizado:

my_module.services.yml

Em seguida, dentro do arquivo você pode especificar o nome do serviço, seguido por sua classe e dependências de outros serviços.

my_custom_service:
  class: Drupal\my_module\MyServiceClass
  arguments: ['@entity_type.manager']

MyServiceClass.php

<?php

namespace Drupal\my_module;

use Drupal\Core\Entity\EntityTypeManagerInterface;

/**
 * My service class.
 */
class MyServiceClass {

  protected EntityTypeManagerInterface $entityTypeManager;

  /**
   * My service class construtor.
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
    $this->entityTypeManager = $entity_type_manager;
  }
  
  /**
   * Load node by title.
   *
   * @param string $title
   *   The title used to load the node.
   *
   * @return Node|null
   *   Return the found Term object or NULL.
   */
  public function loadNodeByTitle($title):Node|null {
    $nodes = $this->entityTypeManager->getStorage('node')
      ->loadByProperties([
        'title' => $pid,
      ]);

    return ($nodes) ? reset($nodes) : NULL;
  }
}    

Agora, você pode chamar seu serviço usando o método genérico \Drupal::service() ou usando a Injeção de Dependência.

Using generic \Drupal::service() method

$my_custom_service_instance = \Drupal::service('my_custom_service');

$node = $my_custom_service_instance->loadNodeByTitle($title);

A Injeção de Dependência será explicada em outro tópico, pois possui algumas particularidades que precisam ser melhor explicadas.

Sobre o Autor

Profile picture for user fkatsukawa

Fernando Katsukawa é desenvolvedor backend senior certificado, que já trabalha a 12 anos com o Drupal e contando...

Salvei seu valioso tempo? Use o copo abaixo para me comprar um cafezinho!
buy me a coffee - cup