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