11.3 依赖注入和控制器
控制器
控制器使用依赖注入比较容易,因为他们提供返回服务容器的 create() 方法。我们已经创建了路由,现在创建下控制器文件:
src/Controller/DIController.php
继承 ControllerBase
继承基类通常是有意义的。ControllerBase
提供了使控制器支持依赖注入的系统。
- create() / __construct()
ControllerBase
给了我们一个传递了服务容器的 create() 方法。我们可以使用这个 create 方法返回我们需要的任何服务,把它们传递给 __construct() 方法,作为类属性存储起来。return new static() 行的意思是这个方法将返回它所在类的一个新实例。 - Route Method
我们的 conversationAboutMood() 方法很简单 —- 它使用我们的服务取得一个信息,之后用这个信息返回一个渲染数组。
<?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>',
];
}
}