Volver al Blog

Cómo Crear y Usar Servicios en Drupal 8+: Una Guía Detallada con Código Práctico

2023-04-153 min de lectura

Drupal, el sistema de gestión de contenidos de código abierto, ha recorrido un largo camino desde su inicio. Con el lanzamiento de Drupal 8, vimos un cambio masivo en la arquitectura subyacente: la adopción de un enfoque de programación más orientado a objetos utilizando componentes de Symfony. Un componente notable que se introdujo en Drupal 8 es el contenedor de servicios, que desde entonces ha mejorado la forma en que se desarrollan los módulos y temas.

Este artículo proporcionará una mirada en profundidad a los servicios de Drupal 8+ y cómo se pueden utilizar para crear código eficiente, modular y mantenible. Además, repasaremos un código de ejemplo para una mejor comprensión.

¿Qué son los Servicios de Drupal?

En Drupal 8+, los servicios son componentes u objetos reutilizables que proporcionan funcionalidades específicas. Están diseñados para seguir el patrón de diseño de Inyección de Dependencias (DI) y generalmente se almacenan en el contenedor de servicios. Este patrón de diseño te permite crear código débilmente acoplado, lo que facilita su gestión y mantenimiento.

Algunos ejemplos de servicios de Drupal incluyen la conexión a la base de datos, el gestor de entidades y el renderizador.

Creación de un Servicio Personalizado

Para proporcionar un servicio personalizado en tu módulo, necesitas crear un archivo services.yml dentro del directorio raíz de tu módulo. Este archivo se utiliza para definir la clase de tu nuevo servicio y cualquier dependencia que pueda tener. Todos los servicios se crean como instancias de clases PHP.

Paso 1: Crear el Archivo services.yml

  1. Primero, crea un archivo YAML con el nombre tumedulo.services.yml, reemplazando "tumedulo" con el nombre de máquina de tu módulo.
  2. Define el servicio en el archivo YAML, incluyendo su clase y cualquier servicio necesario.

Aquí tienes un archivo services.yml de ejemplo:

services:
  tumedulo.servicio_ejemplo:
    class: Drupal\tumedulo\ServicioEjemplo
    arguments: ['@database']

Paso 2: Crear la Clase del Servicio

  1. Crea un nuevo directorio en src dentro del directorio raíz de tu módulo.
  2. Dentro del directorio src, crea un archivo PHP con el mismo nombre que la clase definida en el archivo YAML. En nuestro ejemplo, sería ServicioEjemplo.php.
  3. Define la clase en el nuevo archivo, extiende cualquier clase base necesaria e implementa cualquier interfaz requerida. Utiliza la inyección de dependencias para construir la clase.

Aquí tienes un archivo ServicioEjemplo.php de ejemplo:

// Define el espacio de nombres para esta clase.
namespace Drupal\tumedulo;

// Importa la clase Drupal\Core\Database\Connection para que pueda ser utilizada dentro de esta clase.
use Drupal\Core\Database\Connection;

// Define una clase llamada ServicioEjemplo.
class ServicioEjemplo {

  // Define una propiedad llamada $database que puede ser accedida dentro de esta clase.
  protected $database;

  // Define un método constructor que toma un objeto Connection y lo asigna a la propiedad $database.
  public function __construct(Connection $database) {
    $this->database = $database;
  }

  // Define un método llamado obtenerTodosLosUsuarios que devuelve todos los usuarios de la tabla 'users' en la base de datos.
  public function obtenerTodosLosUsuarios() {
    // Crea una nueva consulta select en la tabla 'users'.
    $query = $this->database->select('users', 'u');

    // Selecciona los campos 'uid', 'name' y 'mail' de la tabla 'users'.
    $query->fields('u', ['uid', 'name', 'mail']);

    // Ejecuta la consulta y recupera todos los resultados como un array asociativo.
    return $query->execute()->fetchAll();
  }
}

En este ejemplo, hemos creado un servicio personalizado simple que recupera todos los usuarios de la base de datos. Como podemos ver, hemos utilizado la inyección de dependencias para inyectar la conexión a la base de datos en el servicio.

Paso 3: Usar el Servicio Personalizado

Acceder a tu servicio personalizado no podría ser más sencillo. En tu módulo, tema u otro servicio, utiliza la clase \Drupal para llamar a tu servicio personalizado, de esta manera:

$servicio_ejemplo = \Drupal::service('tumedulo.servicio_ejemplo');
$todos_los_usuarios = $servicio_ejemplo->obtenerTodosLosUsuarios();

¡Y eso es todo! Has creado con éxito un servicio personalizado en Drupal 8+.

Conclusión

Los servicios de Drupal 8+ permiten a los desarrolladores escribir código limpio, reutilizable y bien contenido. Al crear servicios personalizados y utilizar el patrón de diseño de Inyección de Dependencias (DI), los desarrolladores pueden implementar eficientemente características modulares y mejoras en los proyectos de Drupal.

Con una mejor comprensión de los servicios de Drupal y algo de código de ejemplo a mano, ahora tienes las herramientas para crear tus propios servicios personalizados y mejorar la mantenibilidad y modularidad de tus proyectos de Drupal.