12.15.5. Inyección de dependencias en una clase/servicio personalizado
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.