Параметри методів
Параметри RPC-методу — це параметри PHP-методу. Бандл бере їхні назви, типи й значення за замовчуванням із сигнатури та PHPDoc, будує з них JSON Schema для документації і перед викликом перетворює вхідні значення на потрібні типи.
Скалярні типи
string, int, float, bool, array, mixed та їхні nullable/union-варіанти передаються як є. Параметр зі значенням за замовчуванням (зокрема null) необов'язковий.
public function search(string $query, int $limit = 20, ?string $sort = null): array
Неправильний тип чи відсутній обов'язковий параметр повертає помилку -32602 з переліком проблем по кожному параметру — див. Обробка помилок.
Точні типи з PHPDoc
Якщо нативного типу недостатньо (array), точний тип береться з @param. Імена класів розв'язуються через use-імпорти класу процедури.
/**
* @param OrderItemDto[] $items
* @param array<string, int|string> $meta
*/
public function save(array $items, array $meta = []): bool
DTO
Параметр, тип якого — клас, автоматично створюється з JSON-об'єкта:
final class CreateOrderDto
{
public function __construct(
public string $sku,
public int $qty = 1,
) {}
}
public function create(CreateOrderDto $order): int
{"jsonrpc": "2.0", "id": 1, "method": "Order.create", "params": {"order": {"sku": "A-1", "qty": 2}}}
- Колекція DTO описується в PHPDoc (
@param CreateOrderDto[] $orders) — кожен елемент масиву стає об'єктом. - Для union-типів (
FooDto|BarDto) береться перший DTO, який вдалося створити. - Значення, з якого не вдається створити DTO, повертає помилку валідації, а не сирий масив.
- У схемі DTO властивості зі значенням за замовчуванням отримують
default, а вrequiredпотрапляють лише властивості без нього.
Автоматична конвертація
Для параметрів з такими типами значення конвертується без додаткових атрибутів:
| Тип параметра | Що передає клієнт | Конвертор |
|---|---|---|
BackedEnum |
значення case ("paid") |
BackedEnumConvertor |
| pure enum | назву case | EnumConvertor |
DateTime, DateTimeImmutable, DateTimeInterface |
рядок дати | DateTimeConverter |
Symfony\Component\Uid\*, Ramsey\Uuid\* |
рядок UUID | UuidConverter |
| сутність Doctrine | ідентифікатор | DoctrineEntityConverter |
enum OrderStatus: string
{
case NEW = 'new';
case PAID = 'paid';
}
/**
* @param OrderStatus[] $statuses
*/
public function find(OrderStatus $status, array $statuses = []): array
// {"method": "Order.status", "params": {"order": 42}} — Order завантажиться за id
public function status(Order $order): string
DoctrineEntityConverter реєструється лише тоді, коли ввімкнено DoctrineBundle.
У відповіді ці типи перетворюються назад на скаляри: enum → значення, дата → рядок (Y-m-d H:i:s), UUID → рядок, сутність → ідентифікатор (або __toString() для Stringable).
#[RPC\Param]
Атрибут явно задає, які скалярні типи приймає параметр і яким конвертором перетворювати значення. Потрібен, коли тип не підтримується автоматично або треба інший конвертор.
public function __construct(
int $type, // бітова маска Param::STRING | Param::INT | Param::FLOAT | Param::NULL
bool $collection = false, // значення — масив, конвертується кожен елемент
array $context = [], // наприклад, [Param::C_CONVERTOR => MyConvertor::class]
)
use Ufo\RpcObject\RPC;
public function charge(
#[RPC\Param(RPC\Param::STRING, context: [RPC\Param::C_CONVERTOR => MoneyConvertor::class])]
Money $amount,
): bool
Готові маски: Param::NUMBER, Param::NULLABLE_STRING, Param::NULLABLE_NUMBER, Param::MIXED.
Власний конвертор
Реалізуйте Ufo\JsonRpcBundle\ParamConvertors\IParamConvertor. З autoconfigure клас автоматично отримує тег rpc.param_convertor, і параметри підтримуваного типу конвертуються без атрибута.
use Ufo\JsonRpcBundle\ParamConvertors\IParamConvertor;
use Ufo\RpcObject\RPC\Param;
final class MoneyConvertor implements IParamConvertor
{
public function toScalar(object $object, array $context = [], ?callable $callback = null): array|string|int|float|null
{
return $object->amount;
}
public function toObject(int|string|float|null $value, array $context = [], ?callable $callback = null): ?object
{
return new Money((int) $value);
}
public function supported(string $classFQCN): bool
{
return $classFQCN === Money::class;
}
public function getParamAttr(string $classFQCN): Param
{
return new Param(Param::INT, context: [Param::C_CONVERTOR => self::class]);
}
}
Спеціальні параметри $rpc
Об'єкт $rpc у params не передається в метод, а керує виконанням запиту:
| Ключ | Призначення |
|---|---|
callback |
URL, на який надіслати результат — див. Webhook |
timeout |
Таймаут виконання, секунди (за замовчуванням 10) |
rayId |
Ідентифікатор батьківського запиту для трасування |
ignoreCache |
true — обійти кеш відповіді і записати його заново |
{"jsonrpc": "2.0", "id": 1, "method": "Orders.get", "params": {"id": 10, "$rpc": {"ignoreCache": true}}}