Власні API методи

Власні API методи

Будь-який клас застосунку стає API-сервісом, якщо реалізує інтерфейс Ufo\JsonRpcBundle\ApiMethod\Interfaces\IRpcService. Інтерфейс не нав'язує логіки — він лише позначає клас тегом ufo.rpc.service, за яким бандл збирає карту методів під час компіляції контейнера.

Кожен публічний нестатичний метод такого класу (крім конструктора) стає JSON-RPC методом з назвою <назва класу>.<метод>.

<?php

namespace App\Api;

use Ufo\JsonRpcBundle\ApiMethod\Interfaces\IRpcService;
use Ufo\RpcObject\RPC;

#[RPC\Info('Messenger')]
class MessengerApi implements IRpcService
{
    public function __construct(private Mailer $mailer) {}

    /**
     * A method for sending an email message
     * @param string $email The email address
     * @param string $text Message body
     * @param string $subject Optional message subject parameter
     */
    public function sendEmail(string $email, string $text, string $subject = 'Message without subject'): bool
    {
        return $this->mailer->send($email, $subject, $text);
    }
}

У прикладі з'явиться метод Messenger.sendEmail:

Request

{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "Messenger.sendEmail",
    "params": {
        "email": "user@example.com",
        "text": "Hello!"
    }
}

Response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": true
}

Параметри можна передавати й позиційно: "params": ["user@example.com", "Hello!"].

Карта методів будується під час компіляції контейнера. Після додавання чи зміни методів у prod виконайте bin/console cache:clear.

Іменування

Без атрибута назвою класу в API буде коротке ім'я класу (MessengerApi.sendEmail). Атрибут #[RPC\Info] задає псевдонім (Messenger.sendEmail), символ-роздільник і версію API.

Гарна практика

Сприймайте назву класу як простір імен, а назву методу — як дію: Cart.addProduct, Cart.getProducts, Messenger.sendEmail, Messenger.sendSms. Так одноіменні методи різних класів не конфліктують (Product.create, User.create), а з назв зрозуміло, що вміє сервер.

Опис методів і параметрів

Документація будується з усього, що відомо про метод: назв, нативних типів, значень за замовчуванням і докблоків. Опис методу й параметрів береться з PHPDoc, а точний тип — з @param / @return, якщо нативного типу недостатньо:

/**
 * Creates an order
 * @param OrderItemDto[] $items
 * @return array<string, OrderItemDto>
 */
public function create(array $items, ?string $comment = null): array

Параметр з null за замовчуванням або зі значенням за замовчуванням необов'язковий. Детально про типи — на сторінці Параметри методів, про результат — Формат відповіді.

Назву (summary) і опис методу в документації можна перекласти, не змінюючи код — див. Документація API.

Застарілі методи

Метод з @deprecated у докблоці або з атрибутом #[\Deprecated] позначається в OpenRPC як "deprecated": true, але продовжує працювати.

/**
 * @deprecated use Orders.create
 */
public function createOrder(array $items): array

Приховати метод з API

Публічний метод, який не має бути методом API, позначте #[RPC\IgnoreApi]: його немає ні в карті методів, ні в документації.

#[RPC\IgnoreApi]
public function rebuildIndex(): void

Сервіси в аргументах методу

Окрім ін'єкції через конструктор, сервіс можна отримати прямо в аргументі методу через #[Autowire]. Такий аргумент не є RPC-параметром: його немає в документації, і клієнт його не передає.

use Symfony\Component\DependencyInjection\Attribute\Autowire;

public function report(int $id, #[Autowire(service: 'app.report_builder')] ReportBuilder $builder): array

У версіях 10.0.1–10.3.0 #[Autowire] в аргументах методу не працював (виправлено в 10.3.1). На цих версіях використовуйте конструктор.

RPC атрибути

Атрибут Де Призначення
#[RPC\Info] клас Псевдонім, роздільник, версія API, видалені методи
#[RPC\APIGroups] клас, метод До яких груп API належить метод
#[RPC\Assertions] параметр Валідація обмеженнями Symfony
#[RPC\Param] параметр Явна конвертація значення в об'єкт
#[RPC\DTO] метод, властивість Формат DTO для результату чи параметра
#[RPC\Cache] метод Кешування відповіді
#[RPC\CacheRelation] метод Інвалідація пов'язаного кешу
#[RPC\Lock] метод Заборона одночасних викликів
#[RPC\IgnoreApi] метод Прибрати метод з API

Усі атрибути — з пакета ufo-tech/rpc-objects (простір імен Ufo\RpcObject\RPC).