Every object which is using the Drupal\Core\DependencyInjection\ContainerInjectionInterface (e.g. controllers, forms and blocks), must implement the create() factory method to pass the dependencies into the class constructor. Controllers, forms and blocks are not defined via the *.services.yml file.
Example How to inject current_user service in custom form:
<?php
namespace Drupal\mymodule\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Class MyModuleForm
* @package Drupal\mymodule\Form
*/
class MyModuleForm extends FormBase {
/**
* @var AccountInterface $account
*/
protected $account;
/**
* Class constructor.
*/
public function __construct(AccountInterface $account) {
$this->account = $account;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
// Instantiates this form class.
return new static(
// Load the service required to construct this class.
$container->get('current_user')
);
}
/**
* {@inheritdoc}.
*/
public function getFormId() {
return 'mymodule_form';
}
/**
* {@inheritdoc}.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// Get current user data.
$displayName = $this->account->getDisplayName();
// ...
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// ...
}
}
Example how do I use dependency injection in Controller:
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
class MyModuleController extends ControllerBase
{
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a MyController object
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
*/
public function __construct(ModuleHandlerInterface $module_handler)
{
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container)
{
return new static(
$container->get('module_handler')
);
}
}