logo

Paleta - Deixe colorido🎨

Palette — Construtor visual de páginas. Não precisa ser designer.

Demonstração ao vivo Baixar Palette

Scroll

12.15.5. Injeção de dependências em uma classe/serviço personalizado

16/03/2021, by Ivan

Nos artigos anteriores vimos o que são Services e Dependency Injection (DI) e como usá-los no seu controller, bloco e formulário:

12.15. Services и Dependency Injection.
12.15.1. Dependency Injection в контроллере
12.15.2. Dependency Injection в блоке
12.15.3. Dependencies Injection в BaseForm
12.15.4. Dependencies Injection в ConfigFormBase конфигурационной форме

Neste artigo veremos um exemplo de como adicionar serviços via DI numa classe/serviço personalizada. Vamos analisar usando como exemplo o módulo Book (código e caminhos mantidos):

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

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

Em arguments indicamos quais objetos queremos obter do Service container — por isso não precisamos adicionar um método create() na nossa 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;
...

/**
 * Defines a book manager.
 */
class BookManager implements BookManagerInterface {

  /**
   * Entity manager Service Object.
   *
   * @var \Drupal\Core\Entity\EntityManagerInterface
   */
  protected $entityManager;

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

  /**
   * Books Array.
   *
   * @var array
   */
  protected $books;

  /**
   * Book outline storage.
   *
   * @var \Drupal\book\BookOutlineStorageInterface
   */
  protected $bookOutlineStorage;

  /**
   * Stores flattened book trees.
   *
   * @var array
   */
  protected $bookTreeFlattened;

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

  /**
   * Constructs a BookManager object.
   */
  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;
  }

  ...

}

Removi do exemplo o código que não diz respeito ao DI, para facilitar a visualização do que precisa ser adicionado à classe personalizada. No restante, a adição de serviços funciona da mesma forma que no controller.