Drupal 8 模块开发 11.3 : 依赖注入和控制器

蒲公英 提交于 周四, 08/17/2017 - 18:49
Drupal8模块开发

原文地址:
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() 方法很简单 ---- 它使用我们的服务取得一个信息,之后用这个信息返回一个渲染数组。