logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

12.15.5. Iniezione delle dipendenze in una classe/servizio personalizzato

29/09/2025, by Ivan

Menu

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.