Модульное расширение 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, обращайтесь!