12.15.5. Iniezione delle dipendenze in una classe/servizio personalizzato
Nelle scorse articoli abbiamo analizzato cosa sono i Services, la Dependency Injection (DI) e come utilizzarli nel nostro controller, blocco e form:
12.15. Services e Dependency Injection.
12.15.1. Dependency Injection nel controller
12.15.2. Dependency Injection nel blocco
12.15.3. Dependencies Injection in BaseForm
12.15.4. Dependencies Injection in ConfigFormBase (form di configurazione)
In questo articolo un esempio di come aggiungere i servizi tramite DI in una classe/servizio personalizzato. Vediamolo con l’esempio del modulo 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']
In arguments indichiamo quali oggetti vogliamo ottenere dal Service container, perciò non è necessario aggiungere il metodo create() nella nostra classe.
/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;
...
/**
* Definisce un book manager.
*/
class BookManager implements BookManagerInterface {
/**
* Oggetto Service Entity manager.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $entityManager;
/**
* Oggetto Service Config Factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Array di libri.
*
* @var array
*/
protected $books;
/**
* Book outline storage.
*
* @var \Drupal\book\BookOutlineStorageInterface
*/
protected $bookOutlineStorage;
/**
* Memorizza gli alberi dei libri "flattened".
*
* @var array
*/
protected $bookTreeFlattened;
/**
* Il renderer.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* Costruttore di un oggetto 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;
}
...
}
Ho rimosso dal codice gli elementi non collegati alla DI, per rendere più chiaro cosa serve aggiungere nella classe personalizzata. Per il resto, l’aggiunta dei servizi avviene nello stesso modo che in un controller.