Drupal 8 模块开发 8.1 : 服务

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

原文地址:
https://docs.acquia.com/articles/drupal-8-services-dependency-injection-and-service-containers  
 

本课...

  • 创建模块 examples/service_example,使用自定义服务(service )和依赖注入(dependency injection)
  • 学习服务及他们与依赖注入的关系
  • 研究依赖注入的含义及使用
  • 研究服务容器的含义及使用
  • 专注“服务在编程中意味着什么、为什么他们比较实用”
  • 研究创建和注册一个简单的服务

我们将创建一个定义 service_example.example_service 服务的模块,之后在页面 examples/service-example/simple 中使用它,页面由一个简单的 ServiceExampleController 控制器控制。  

创建基础模块

我们将创建以下文件。之前课程里已经解释如何创建路由和 info 文件。

service_example.info.yml 文件:

name: 'Service example'
type: module
description: 'An example module showing how to create and use a service.'
package: 'Acquia Example modules'
core: 8.x

service_example.routing.yml 文件:

service_example_simple:
  path: 'examples/service-example/simple'
  defaults:
    _controller: '\Drupal\service_example\Controller\ServiceExampleController::simple_example'
  requirements:
    _access: 'TRUE'

创建一个服务

我们将创建一个简单服务,它提供一个只返回字符串的功能。之后课程里我们将学习更多服务相关知识,暂时你可以把它想象为全局函数或者库。  

要创建一个服务,你需要使用 service_example.services.yml 文件让系统知道它的存在。之后在 src/ServiceExampleService.php 文件内追加类定义功能。  

service_example.services.yml 文件里,顶级是一个服务列表。每个服务用模块名作为前缀 module_name.service_name 。服务的类名会被定义,类名和包含这个类的文件同名。

service_example.services.yml 文件 :

services:
  service_example.example_service:
    class: Drupal\service_example\ServiceExampleService

ServiceExampleService.php 文件看起来很类似控制器。我们描述定义什么样的类,定义名字空间(Drupal\module_name),我们创建一个公有函数和一些内部逻辑。这个服务的内部逻辑是:当服务被创建时,一个变量被设置为 Student 。当其他代码使用这个服务时,他们能够通过调用 getServiceExampleValue() 函数返回字符串 Student 。

下载文件

<?php

/**
 * @file
 * Contains \Drupal\service_example\ServiceExampleService.
 */

namespace Drupal\service_example;

class ServiceExampleService {

  protected $service_example_value;

  /**
   * When the service is created, set a value for the example variable.
   */
  public function __construct() {
    $this->service_example_value = 'Student';
  }

  /**
   * Return the value of the example variable.
   */
  public function getServiceExampleValue() {
    return $this->service_example_value;
  }

}