Drupal controllers already extend from ControllerBase
, which implements ContainerInjectionInterface
. To inject services, you will need to override that class's create
method.
public static function create(ContainerInterface $container) {
$controller = parent::create($container);
...
return $controller;
}
Within the create
method, you will call $container->get()
for each service you need, and store the result in an instance variable for later use.
For example:
<?php
namespace Drupal\services_examples;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Datetime\DateFormatterInterface;
/**
* A simple example of a service.
*/
class ExampleService implements ExampleServiceInterface {
/**
* The date formatter service.
*
* @var \Drupal\Core\Datetime\DateFormatterInterface
*/
protected DateFormatterInterface $dateFormatter;
/**
* The time service.
*
* @var \Drupal\Component\Datetime\TimeInterface
*/
protected TimeInterface $timeService;
/**
* Create a new ExampleService.
*/
public function __construct(DateFormatterInterface $dateFormatter, TimeInterface $timeService) {
$this->dateFormatter = $dateFormatter;
$this->timeService = $timeService;
}
/**
* {@inheritdoc}
*/
public function getCurrentDate() : string {
return $this->dateFormatter->format($this->timeService->getRequestTime());
}
}
By implementing the constructor appropriately, we can gain access to any Drupal service we may need!