Scroll
12.15.5. カスタムクラス/サービスでの依存性注入(Dependencies injection)
これまでの記事では、Services(サービス)、Dependency Injection(依存性注入、DI)とは何か、そしてそれらをコントローラー、ブロック、フォームでどのように使うかを説明しました:
12.15. Services(サービス)とDependency Injection。
12.15.1. コントローラーでの依存性注入(Dependency Injection)
12.15.2. ブロックでの依存性注入(Dependency Injection)
12.15.3. BaseFormでの依存性注入(Dependencies Injection)
12.15.4. ConfigFormBase設定フォームでの依存性注入(Dependencies Injection)
この記事では、カスタムクラス/サービスでDIを通じてサービスを追加する方法の例を示します。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']
argumentsでは、Service containerから取得したいオブジェクトを指定するため、クラスにcreate()メソッドを追加する必要はありません。
/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;
}
...
}
カスタムクラスに何を追加すべきかを確認しやすくするために、例からDIに関係しないコードを削除しました。その他の点では、サービスの追加方法はコントローラーの場合と同じです。