Назад к блогу

Как создавать и использовать сервисы 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. Сначала создайте файл YAML с именем yourmodule.services.yml, заменив «yourmodule» машинным именем вашего модуля.
  2. Определите сервис в файле YAML, включая его класс и любые необходимые сервисы.

Вот пример файла services.yml:

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

Шаг 2: Создайте класс сервиса

  1. Создайте новый каталог src в корневом каталоге вашего модуля.
  2. Внутри каталога src создайте файл PHP с тем же именем, что и класс, определенный в файле YAML. В нашем примере это будет 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'.
    $query = $this->database->select('users', 'u');

    // Выберите поля 'uid', 'name' и 'mail' из таблицы 'users'.
    $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.