原文地址:
https://docs.acquia.com/articles/drupal-8-dependency-injection-and-controllers
控制器
控制器使用依赖注入比较容易,因为他们提供返回服务容器的 create() 方法。我们已经创建了路由,现在创建下控制器文件:
src/Controller/DIController.php
<?php /** * @file * Contains \Drupal\di_example\Controller\DIController. */ namespace Drupal\di_example\Controller; use Drupal\Core\Controller\ControllerBase; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\di_example\DITalk; class DIController extends ControllerBase { /** * @var \Drupal\di_example\DITalk */ protected $dITalk; /** * @param \Drupal\di_example\DITalk $DITalk */ public function __construct(DITalk $DITalk) { $this->dITalk = $DITalk; } /** * When this controller is created, it will get the di_example.talk service * and store it. * * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * @return static */ public static function create(ContainerInterface $container) { return new static( $container->get('di_example.talk') ); } public function conversationAboutMood() { // We use the injected service to get the message. $message = $this->dITalk->getResponseToMood(); // We return a render array of the message. return [ '#type' => 'markup', '#markup' => '<p>' . $this->t($message) . '</p>', ]; } }
继承 ControllerBase
继承基类通常是有意义的。ControllerBase 提供了使控制器支持依赖注入的系统。
- create() / __construct()
ControllerBase 给了我们一个传递了服务容器的 create() 方法。我们可以使用这个 create 方法返回我们需要的任何服务,把它们传递给 __construct() 方法,作为类属性存储起来。return new static() 行的意思是这个方法将返回它所在类的一个新实例。 - Route Method
我们的 conversationAboutMood() 方法很简单 ---- 它使用我们的服务取得一个信息,之后用这个信息返回一个渲染数组。