Модульное расширение GraphQL API
Артем Житник
В процессе повествования может возникнуть путаница с термином "модуль". Модули есть в Битриксе, все мы знаем о них (инфоблоки, торговый каталог и т.д.), а есть части GraphQL API в моей реализации, который сам по себе имеет модульную структуру. Далее речь будет идти о последних модулях. В недавних обновлениях была добавлена возможность расширения API за счет добавления своих сегментов - модулей.
Модуль GraphQL API
Будем считать что решение GraphQL API у вас уже установлено. Вы хотите запилить свое дополнение. Модуль GraphQL API - это набор исходного кода определенной структуры. В одной папке должны присутствовать файлы Module.php, TypeRegistry.php, XxxModuleQueryType.php (где Xxx - уникальный код вашего модуля).
Module.php
namespace MyNamespace;
use Rbx\GraphQL\Type\ModuleBase;
class Module extends ModuleBase {
public static function getName(): string {
return "xxx";
}
public static function getQueryEntrypointType(bool $restrict): ?callable {
return TypeRegistry::xxxModuleQuery();
}
public static function getDescription(): string {
return "Мой тестовый модуль";
}
public static function getSort(): int {
return 1000;
}
public static function getTypeRegistry(): string {
return TypeRegistry::class;
}
}
TypeRegistry.php
namespace MyNamespace;
use Rbx\GraphQL\Type\TypeRegistryBase;
class TypeRegistry extends TypeRegistryBase {
public static function xxxModuleQuery(): callable {
return static::get(XxxModuleQueryType::class, false);
}
}
XxxModuleQueryType.php
use GraphQL\Type\Definition\ObjectType;
use Rbx\GraphQL\Type\Main;
class XxxModuleQueryType extends ObjectType {
public function __construct() {
parent::__construct([
"name" => "XxxModuleQuery",
"description" => "Мой тестовый модуль",
"fields" => static fn(): array =>
[
"today" => [
"type" => Main\TypeRegistry::string(),
"description" => "Строка с описанием текущей даты",
"resolve" => fn() => "Сегодня " . date("d.m.Y")
],
],
]);
}
}Это минимальный модуль с методом получения текущей даты.
Осталось только присоединить его через событие OnAddCustomModule.
init.php
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
"rbx.graphql",
"OnAddCustomModule",
[MyNamespace\Module::class, "getClass"]
);
И теперь на запрос к API:
query{
xxx{
today
}
}мы получим ответ:
{
"data": {
"xxx": {
"today": "Сегодня 30.10.2021"
}
}
}Это, конечно, примитивный пример. На самом деле, можно объявлять вложенные структуры типов, объявлять массивы, проверять права доступа, делать схему настраиваемой через модуль GraphQL API. Можете посмотреть практическую реализацию в бесплатном решении IX мониторинг. Также я могу разработать для вас расширение API, обращайтесь!