原文地址:
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; } }