Drupal. Создание REST API в Drupal 9

При разработке API всегда необходимо указать, какой метод HTTP будет использоваться для выполнения операций CRUD с данными. Здесь это можно сделать возможным с помощью нескольких HTTP-запросов, таких как POST (создание данных), GET (получение / чтение данных), DELETE (удаление данных) или PATCH / PUT (обновление данных). Чтобы узнать, как создавать собственные веб-службы, мы создадим настраиваемый модуль, представляющий RESTful API, который может отображать список терминов таксономии с нашего сайта Drupal 9.

Шаг 1. Создаем свой модуль sample_rest_resource в директории modules/custom.

Создаем свой модуль в modules/custom Шаг 2. Создаем файл с расширением info.yml для описания модуля sample_rest_resource.

Создаем файл с расширением info.yml

В файле будет следующее описание:

name: Sample Rest Resource
type: module
description: Module for implementing Custom Rest Service.
core_version_requirement: ^8.8 || ^9
package: Example

И создаем пустой файл sample_rest_resource.module. Получится такая структура:

Получится такая структура файла

Шаг 3. Создаем структуру в создаваемом модуле src \Plugin\rest\resource:

Создаем структуру в создаваемом модуле src \Plugin\rest\resource

Шаг 4. Создаем файл ресурсов SampleGetRestResource.php в директории resource, добавляем следующий код:

<?
namespace Drupal\sample_rest_resource\Plugin\rest\resource;

use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Psr\Log\LoggerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
/**
 * Provides a resource to get view modes by entity and bundle.
 * @RestResource(
 *   id = "custom_get_rest_resource",
 *   label = @Translation("Custom Get Rest Resource"),
 *   uri_paths = {
 *     "canonical" = "/vb-rest"
 *   }
 * )
 */
class SampleGetRestResource extends ResourceBase {
  /**
   * A current user instance which is logged in the session.
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $loggedUser;
  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   *
   * @param array $config
   *   A configuration array which contains the information about the plugin instance.
   * @param string $module_id
   *   The module_id for the plugin instance.
   * @param mixed $module_definition
   *   The plugin implementation definition.
   * @param array $serializer_formats
   *   The available serialization formats.
   * @param \Psr\Log\LoggerInterface $logger
   *   A logger instance.
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   *   A currently logged user instance.
   */
  public function __construct(
    array $config,
    $module_id,
    $module_definition,
    array $serializer_formats,
    LoggerInterface $logger,
    AccountProxyInterface $current_user) {
    parent::__construct($config, $module_id, $module_definition, $serializer_formats, $logger);

    $this->loggedUser = $current_user;
  }
  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $config, $module_id, $module_definition) {
    return new static(
      $config,
      $module_id,
      $module_definition,
      $container->getParameter('serializer.formats'),
      $container->get('logger.factory')->get('sample_rest_resource'),
      $container->get('current_user')
    );
  }
  /**
   * Responds to GET request.
   * Returns a list of taxonomy terms.
   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
   * Throws exception expected.
   */
  public function get() {
    // Implementing our custom REST Resource here.
    // Use currently logged user after passing authentication and validating the access of term list.
    if (!$this->loggedUser->hasPermission('access content')) {
      throw new AccessDeniedHttpException();
    }	
	$vid = 'vb';
	$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
	foreach ($terms as $term) {
	  $term_result[] = array(
	    'id' => $term->tid,
		'name' => $term->name
	  );
	}

    $response = new ResourceResponse($term_result);
    $response->addCacheableDependency($term_result);
    return $response;
  }

}

Используем метод GET в шаблоне, в котором мы определяем нашу логику в форме кода, чтобы определить, какой вывод требуется. В качестве примера — нам требуется название всех существующих терминов с соответствующими идентификаторами для таксономии vb (машинное имя Vb Test)  для текущего пользователя, вошедшего в систему.

Шаг 5. Создаем словарь таксономии Vb Test и несколько терминов.

Создаем словарь таксономии Vb Test и несколько терминов

Добавляем, например, 2 термина:

Добавляем, например, несколько терминов

Шаг 6. Подключаем Drupal REST API из ядра системы.

Созданный модуль зависит от модуля пользовательского интерфейса Rest и Rest. Модуль Rest UI можно установить с помощью этой команды:

composer require 'drupal/restui:^1.20'

После установки модуля RestUI, необходимо включить оба модуля как на скриншотах:

После установки модуля RestUI, необходимо включить оба модуля

Шаг 7. Включаем созданный модуль:

Включаем созданный модуль

Шаг 8. После включения модуля, включаем ресурс. Действия по пунктам:

  1. Переходим по адресу /admin/config/services/rest
  2. Находим созданный ресурс. Он будет называться также как его назвали: Custom Get Rest Resource.
  3. Включаем и нажимаем Сохранить конфигурацию:

Переходим по адресу /admin/config/services/rest

Находим созданный ресурс. Он будет называться также как его назвали: Custom Get Rest Resource.


4. Переходим по адресу /vb-rest?_format=json и увидим, что данный url вернул запрошенные данные из словаря и параметры терминов.

Переходим по адресу и видим результат

REST можно использовать как тип передачи данных, построенный на основе архитектуры протоколов HTTP. Это помогает легко отправлять и извлекать данные между двумя или более разными службами с помощью XML или JSON.


Количество просмотров: 142


Понравилась статья?

Возврат к списку