Разработка SEO оптимизированных высокопроизводительных фронтенд приложений на базе 1С-Битрикс.

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

    GraphQL
    GraphQL API модуль для Битрикс
    IX мониторинг
    Битрикс

©2024 ReactiveBx работает на «1С-Битрикс: Управление сайтом» и Next.js