如何创建和使用 Drupal 8+ 服务:一份包含实际代码的详细指南
Drupal,这个开源内容管理系统,自诞生以来已经取得了长足的进步。随着 Drupal 8 的发布,我们看到了其底层架构的巨大转变:采用了更多面向对象的编程方法,并使用了 Symfony 组件。Drupal 8 中引入的一个值得注意的组件是服务容器,它自此改进了模块和主题的开发方式。
本文将深入探讨 Drupal 8+ 服务及其如何用于创建高效、模块化和可维护的代码。此外,我们还将通过示例代码来帮助您更好地理解。
什么是 Drupal 服务?
在 Drupal 8+ 中,服务是提供特定功能的、可重用的组件或对象。它们被设计为遵循依赖注入(DI)设计模式,并且通常存储在服务容器中。这种设计模式允许您创建松耦合的代码,从而更易于管理和维护。
Drupal 服务的一些例子包括数据库连接、实体管理器和渲染器。
创建自定义服务
要在您的模块中提供自定义服务,您需要在模块的根目录下创建一个services.yml文件。此文件用于定义您的新服务的类及其可能拥有的任何依赖项。所有服务都创建为 PHP 类的实例。
步骤 1:创建 services.yml 文件
- 首先,创建一个名为yourmodule.services.yml的 YAML 文件,将“yourmodule”替换为您的模块的机器名称。
- 在 YAML 文件中定义服务,包括其类和任何必需的服务。
这是一个services.yml文件的示例:
services:
yourmodule.sample_service:
class: Drupal\yourmodule\SampleService
arguments: ['@database']
步骤 2:创建服务类
- 在模块根目录下的src目录中创建一个新目录。
- 在src目录中,创建一个与 YAML 文件中定义的类同名的 PHP 文件。在我们的示例中,它将是SampleService.php。
- 在新的文件中定义类,继承任何必要的基类,并实现任何需要的接口。使用依赖注入来构造类。
这是一个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 项目的可维护性和模块化程度的工具。