8.1 服务

本课内容

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

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

创建基础模块

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

service_example.info.yml 文件(见代码1):

service_example.routing.yml 文件(见代码2):

代码1:

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

 

代码2:

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;
  }

}

 

本书共39小节。


评论 (0)