Как создавать и использовать сервисы Drupal 8+: подробное руководство с практическим кодом
Drupal, система управления контентом с открытым исходным кодом, прошла долгий путь с момента своего создания. С выходом Drupal 8 мы увидели масштабное изменение базовой архитектуры: внедрение более объектно-ориентированного подхода к программированию с использованием компонентов Symfony. Одним из заметных компонентов, представленных в Drupal 8, стал контейнер сервисов, который с тех пор улучшил способы разработки модулей и тем.
В этой статье мы подробно рассмотрим сервисы Drupal 8+ и то, как их можно использовать для создания эффективного, модульного и поддерживаемого кода. Кроме того, мы рассмотрим пример кода для лучшего понимания.
Что такое сервисы Drupal?
В Drupal 8+ сервисы — это многоразовые компоненты или объекты, предоставляющие определенные функциональные возможности. Они разработаны в соответствии с шаблоном проектирования «Внедрение зависимостей» (DI) и обычно хранятся в контейнере сервисов. Этот шаблон проектирования позволяет создавать слабосвязанный код, что упрощает управление и поддержку.
Примеры сервисов Drupal включают соединение с базой данных, менеджер сущностей и рендерер.
Создание пользовательского сервиса
Чтобы предоставить пользовательский сервис в вашем модуле, вам нужно создать файл services.yml в корневом каталоге вашего модуля. Этот файл используется для определения класса вашего нового сервиса и любых зависимостей, которые он может иметь. Все сервисы создаются как экземпляры классов PHP.
Шаг 1: Создайте файл services.yml
- Сначала создайте файл YAML с именем yourmodule.services.yml, заменив «yourmodule» машинным именем вашего модуля.
- Определите сервис в файле YAML, включая его класс и любые необходимые сервисы.
Вот пример файла services.yml:
services:
yourmodule.sample_service:
class: Drupal\yourmodule\SampleService
arguments: ['@database']
Шаг 2: Создайте класс сервиса
- Создайте новый каталог src в корневом каталоге вашего модуля.
- Внутри каталога src создайте файл PHP с тем же именем, что и класс, определенный в файле YAML. В нашем примере это будет 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'.
$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.