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.