Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

12.15.5. Inyección de dependencias en una clase/servicio personalizado

04/05/2025, by Ivan

Menu

En los artículos anteriores analizamos qué son los Servicios, la Inyección de Dependencias (DI) y cómo usarlos en tu controlador, bloque y formulario:

12.15. Servicios e Inyección de Dependencias.
12.15.1. Inyección de dependencias en el controlador
12.15.2. Inyección de dependencias en un bloque
12.15.3. Inyección de dependencias en BaseForm
12.15.4. Inyección de dependencias en un formulario de configuración ConfigFormBase

En este artículo se muestra un ejemplo de cómo añadir servicios mediante DI en una clase o servicio personalizado. Veámoslo con el ejemplo del módulo Book:

/core/modules/book/book.services.yml:

services:
  book.manager:
    class: Drupal\book\BookManager
    arguments: ['@entity.manager', '@string_translation', '@config.factory', '@book.outline_storage', '@renderer']

En arguments se especifica qué objetos se desean obtener desde el Service Container, por lo que no es necesario implementar el método create() en la clase.

/core/modules/book/src/BookManager.php:

<?php

namespace Drupal\book;

use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
...

/**
 * Define un gestor para los libros.
 */
class BookManager implements BookManagerInterface {

  /**
   * Servicio Entity Manager.
   *
   * @var \Drupal\Core\Entity\EntityManagerInterface
   */
  protected $entityManager;

  /**
   * Servicio Config Factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * Array de libros.
   *
   * @var array
   */
  protected $books;

  /**
   * Almacenamiento de esquema de libro.
   *
   * @var \Drupal\book\BookOutlineStorageInterface
   */
  protected $bookOutlineStorage;

  /**
   * Árboles de libros aplanados.
   *
   * @var array
   */
  protected $bookTreeFlattened;

  /**
   * Servicio renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * Constructor de BookManager.
   */
  public function __construct(EntityManagerInterface $entity_manager, TranslationInterface $translation, ConfigFactoryInterface $config_factory, BookOutlineStorageInterface $book_outline_storage, RendererInterface $renderer) {
    $this->entityManager = $entity_manager;
    $this->stringTranslation = $translation;
    $this->configFactory = $config_factory;
    $this->bookOutlineStorage = $book_outline_storage;
    $this->renderer = $renderer;
  }

  ...

}

Se ha eliminado el código no relacionado con DI del ejemplo para facilitar la visualización de lo que debe añadirse en una clase personalizada. Por lo demás, la adición de servicios se realiza del mismo modo que en un controlador.