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
29/09/2025, by Ivan

Menu

Nell’articolo precedente abbiamo visto cosa è la Dependency Injection:

12.15. Services e Dependency Injection.

In questo articolo è riportato un esempio di codice con Dependency Injection in un controller.

/modules/custom/drupalbook/src/Controller/ModalFormContactController.php:

<?php

namespace Drupal\drupalbook\Controller;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Form\FormBuilder;

/**
 * Classe ModalFormContactController.
 */
class ModalFormContactController extends ControllerBase {

  /**
   * Il form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

  /**
   * Costruttore ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Il form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   Il service container di Drupal.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

  /**
   * Callback per il form modale.
   */
  public function openModalForm() {
    $response = new AjaxResponse();
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    $enquiry_title = $this->t("Invia una richiesta a @business_name", ['@business_name' => $modal_form['business_name']['#value']]);
    $response->addCommand(new OpenModalDialogCommand($enquiry_title, $modal_form));

    return $response;
  }

}

Vediamo le parti di codice per la DI (Dependency Injection). 

namespace Drupal\drupalbook\Controller;

Per prima cosa indichiamo il namespace, ovvero lo spazio dei nomi in cui si trova il file; in questo caso drupalbook è il machine name del vostro modulo.

use Symfony\Component\DependencyInjection\ContainerInterface;

Importiamo la classe ContainerInterface, che successivamente useremo per ottenere oggetti dal Service Container.

  /**
   * Il form builder.
   *
   * @var \Drupal\Core\Form\FormBuilder
   */
  protected $formBuilder;

Dichiariamo la proprietà in cui salveremo l’oggetto proveniente dal Service Container. Il commento @var \Namespace aiuta la vostra IDE a capire quali metodi mostrare nell’autocompletamento.

  /**
   * Costruttore ModalFormContactController.
   *
   * @param \Drupal\Core\Form\FormBuilder $form_builder
   *   Il form builder.
   */
  public function __construct(FormBuilder $form_builder) {
    $this->formBuilder = $form_builder;
  }

Nel costruttore riceviamo come parametro l’oggetto dal Service Container, che andremo a creare nel metodo create(). Qui riceviamo l’oggetto e lo salviamo nella proprietà dichiarata in precedenza $formBuilder. Se collegate un nuovo servizio, dovete aggiungerlo come parametro nel __construct(), quindi se servono 10 servizi, avrete 10 parametri.

  /**
   * {@inheritdoc}
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   Il service container di Drupal.
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('form_builder')
    );
  }

Nel metodo create() otteniamo l’oggetto dal Service Container e ritorniamo l’oggetto $form_builder, che nel costruttore sopra abbiamo salvato nella proprietà formBuilder. Notate la convenzione: per le variabili provenienti dal Service Container si usa lowercase ($form_builder), mentre per le proprietà della classe si usa camelCase con la lettera iniziale minuscola (formBuilder).

Ora possiamo usare l’oggetto del Service Container nei metodi della nostra classe:

  /**
   * Callback per il form modale.
   */
  public function openModalForm() {
    ...
    $modal_form = $this->formBuilder->getForm('Drupal\drupalbook\Form\ModalForm');
    ...
  }