12.15.5. Ubrizgavanje zavisnosti (Dependency Injection) u prilagođenoj klasi/servisu
U prethodnim člancima smo objasnili šta su Servisi, ubrizgavanje zavisnosti (Dependency Injection - DI) i kako ih koristiti u svom kontroleru, bloku i formi:
12.15. Servisi i Dependency Injection.
12.15.1. Dependency Injection u kontroleru
12.15.2. Dependency Injection u bloku
12.15.3. Dependency Injection u BaseForm
12.15.4. Dependency Injection u ConfigFormBase konfigurisanoj formi
U ovom članku je primer kako dodavati servise putem DI u prilagođenoj klasi/servisu. Pogledaćemo to na primeru modula 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']
U arguments navodimo koje objekte želimo da dobijemo iz Service container-a, tako da nije potrebno dodavati metodu create() u našu klasu.
/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;
...
/**
* Definiše book manager.
*/
class BookManager implements BookManagerInterface {
/**
* Entity manager servis objekat.
*
* @var \Drupal\Core\Entity\EntityManagerInterface
*/
protected $entityManager;
/**
* Config Factory servis objekat.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Niz knjiga.
*
* @var array
*/
protected $books;
/**
* Storage za book outline.
*
* @var \Drupal\book\BookOutlineStorageInterface
*/
protected $bookOutlineStorage;
/**
* Čuva spljoštene book stabla.
*
* @var array
*/
protected $bookTreeFlattened;
/**
* Renderer.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* Konstruktor BookManager objekta.
*/
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;
}
...
}
Iz primera sam uklonio kod koji nije vezan za DI, kako bi bilo preglednije šta je potrebno dodati u prilagođenu klasu. U svim ostalim slučajevima dodavanje servisa se vrši na isti način kao i u kontroleru.