返回博客

如何创建和使用 Drupal 8+ 服务:一份包含实际代码的详细指南

2023-04-153 分钟阅读

Drupal,这个开源内容管理系统,自诞生以来已经取得了长足的进步。随着 Drupal 8 的发布,我们看到了其底层架构的巨大转变:采用了更多面向对象的编程方法,并使用了 Symfony 组件。Drupal 8 中引入的一个值得注意的组件是服务容器,它自此改进了模块和主题的开发方式。

本文将深入探讨 Drupal 8+ 服务及其如何用于创建高效、模块化和可维护的代码。此外,我们还将通过示例代码来帮助您更好地理解。

什么是 Drupal 服务?

在 Drupal 8+ 中,服务是提供特定功能的、可重用的组件或对象。它们被设计为遵循依赖注入(DI)设计模式,并且通常存储在服务容器中。这种设计模式允许您创建松耦合的代码,从而更易于管理和维护。

Drupal 服务的一些例子包括数据库连接、实体管理器和渲染器。

创建自定义服务

要在您的模块中提供自定义服务,您需要在模块的根目录下创建一个services.yml文件。此文件用于定义您的新服务的类及其可能拥有的任何依赖项。所有服务都创建为 PHP 类的实例。

步骤 1:创建 services.yml 文件

  1. 首先,创建一个名为yourmodule.services.yml的 YAML 文件,将“yourmodule”替换为您的模块的机器名称。
  2. 在 YAML 文件中定义服务,包括其类和任何必需的服务。

这是一个services.yml文件的示例:

services:
  yourmodule.sample_service:
    class: Drupal\yourmodule\SampleService
    arguments: ['@database']

步骤 2:创建服务类

  1. 在模块根目录下的src目录中创建一个新目录。
  2. src目录中,创建一个与 YAML 文件中定义的类同名的 PHP 文件。在我们的示例中,它将是SampleService.php
  3. 在新的文件中定义类,继承任何必要的基类,并实现任何需要的接口。使用依赖注入来构造类。

这是一个SampleService.php文件的示例:

// 为此类定义命名空间。
namespace Drupal\yourmodule;

// 导入 Drupal\Core\Database\Connection 类,以便在此类中使用。
use Drupal\Core\Database\Connection;

// 定义一个名为 SampleService 的类。
class SampleService {

  // 定义一个名为 $database 的属性,该属性可以在此类中访问。
  protected $database;

  // 定义一个构造方法,该方法接受一个 Connection 对象并将其分配给 $database 属性。
  public function __construct(Connection $database) {
    $this->database = $database;
  }

  // 定义一个名为 fetchAllUsers 的方法,该方法从数据库的“users”表中获取所有用户。
  public function fetchAllUsers() {
    // 在“users”表上创建一个新的 select 查询。
    $query = $this->database->select('users', 'u');

    // 从“users”表中选择“uid”、“name”和“mail”字段。
    $query->fields('u', ['uid', 'name', 'mail']);

    // 执行查询并以关联数组的形式获取所有结果。
    return $query->execute()->fetchAll();
  }
}

在此示例中,我们创建了一个从数据库获取所有用户的简单自定义服务。正如我们所见,我们使用依赖注入将数据库连接注入到服务中。

步骤 3:使用自定义服务

访问您的自定义服务再简单不过了。在您的模块、主题或其他服务中,使用\Drupal类来调用您的自定义服务,如下所示:

$sample_service = \Drupal::service('yourmodule.sample_service');
$all_users = $sample_service->fetchAllUsers();

就是这样!您已成功在 Drupal 8+ 中创建了一个自定义服务。

结论

Drupal 8+ 服务使开发人员能够编写干净、可重用且封装良好的代码。通过创建自定义服务并利用依赖注入(DI)设计模式,开发人员可以有效地实现模块化功能并增强 Drupal 项目。

通过对 Drupal 服务有了更好的理解并掌握了一些示例代码,您现在就拥有了创建自己的自定义服务并提高 Drupal 项目的可维护性和模块化程度的工具。