REST Bundle

← REST Bundle

Ashterix

docs: rewrite JsonRpcBundle docs, add SDK docs, move them under docs/api

uk/docs/api/rest-bundle/README.md новий файл +83 −0

1 + # REST Bundle
2 +
3 + :::block class="floatinginfobox"
4 + <include>(docs/api/rest-bundle/.info.md)
5 + :::
6 +
7 + REST API поверх методів [JsonRpcBundle](/docs/api/json-rpc-bundle) для Symfony 7.2+ / 8 (PHP 8.4+).
8 +
9 + RPC-метод лишається єдиною реалізацією: атрибут Symfony `#[Route]` на методі RPC-процедури робить його доступним за власним шляхом і HTTP-методом. Параметри, валідація, безпека, кеш, події та документація беруться з ядра RPC; бандл додає HTTP-маршрути, REST-формат запитів і відповідей, помилки RFC 9457 і документи OpenAPI 3.1 та Postman.
10 +
11 + :::info
12 + Документація описує версію 1.3, яка ще не має тегу (останній реліз — 1.2.0). Те, що з'явилось лише в 1.3, позначено на сторінках. Див. [Історію змін](/docs/api/rest-bundle/change_log).
13 + :::
14 +
15 + ## Від методу до REST
16 +
17 + ::::columns
18 + :::col
19 + **Ваш код**
20 +
21 + ```php
22 + use Symfony\Component\Routing\Attribute\Route;
23 + use Ufo\JsonRpcBundle\ApiMethod\Interfaces\IRpcService;
24 + use Ufo\RpcObject\RPC;
25 +
26 + #[RPC\Info('catalog')]
27 + #[Route('/catalog', name: 'catalog')]
28 + class CatalogApi implements IRpcService
29 + {
30 + #[Route('/items/{id}', name: 'item', methods: ['GET'])]
31 + public function item(int $id): array
32 + {
33 + return ['id' => $id, 'title' => 'Book'];
34 + }
35 + }
36 + ```
37 + :::
38 +
39 + :::col
40 + **Запит**
41 +
42 + ```bash
43 + curl https://example.com/rest/catalog/items/42 \
44 + -H 'Ufo-RPC-Token: change-me'
45 + ```
46 +
47 + **Відповідь** `200`
48 +
49 + ```json
50 + {"id": 42, "title": "Book"}
51 + ```
52 + :::
53 + ::::
54 +
55 + Що ви отримуєте без додаткового коду:
56 +
57 + * `GET /rest` повертає документ OpenAPI 3.1 з операцією `catalog.item`, а `GET /rest/postman` — колекцію Postman;
58 + * значення `42` зі шляху приводиться до `int` за сигнатурою методу (з 1.3);
59 + * помилки — RFC 9457 problem details з HTTP-статусом (`401`, `404`, `405`, `422`, …);
60 + * той самий метод і далі доступний через JSON-RPC: `POST /rpc` з `"method": "catalog.item"`.
61 +
62 + ## Чому REST Bundle
63 +
64 + * **Одна реалізація — два протоколи.** Немає REST-контролера на кожен метод, другого набору DTO чи окремої валідації. [`#[RPC\Assertions]`](/docs/api/json-rpc-bundle/add_rpc_service/assertions), [`#[RPC\Cache]`](/docs/api/json-rpc-bundle/add_rpc_service/cache), [`#[RPC\Lock]`](/docs/api/json-rpc-bundle/add_rpc_service/lock) і [події](/docs/api/json-rpc-bundle/functionality/events) працюють для REST так само, як для JSON-RPC.
65 + * **Публікація явна.** У REST потрапляє лише метод з `#[Route]`; решта лишається тільки в RPC ([Маршрутизація](/docs/api/rest-bundle/routing)).
66 + * **Групи й версії API.** Окремий REST-вхід для кожної [групи API](/docs/api/json-rpc-bundle/functionality/groups) з власними методами, документацією і токенами; [версії](/docs/api/json-rpc-bundle/functionality/versions) під `/v2/...`.
67 + * **Документація з коду.** OpenAPI і Postman будуються з RPC service map: типи, PHPDoc, `@throws`, переклади ([Документація API](/docs/api/rest-bundle/documentation)).
68 + * **Без окремої конфігурації.** Бандл використовує налаштування `ufo_json_rpc`: безпеку, назву проєкту, переклади ([Налаштування](/docs/api/rest-bundle/config)).
69 +
70 + :::info
71 + <include>(change_log/latest.md)
72 + :::
73 +
74 + ## З чого почати
75 +
76 + 1. [Встановіть бандл](/docs/api/rest-bundle/installation) — `composer require ufo-tech/rest-bundle` і файл маршрутів.
77 + 2. Додайте `#[Route]` до потрібних методів ([Маршрутизація](/docs/api/rest-bundle/routing)) і відкрийте `GET /rest`.
78 + 3. Перегляньте, як [передаються параметри](/docs/api/rest-bundle/requests) і як [повертаються помилки](/docs/api/rest-bundle/error_handling).
79 + 4. Налаштуйте [безпеку](/docs/api/rest-bundle/security).
80 +
81 + Через REST недоступні JSON-RPC batch, notifications і `$rpc.callback`: один HTTP-запит — один виклик методу.
82 +
83 + Як бандл влаштований усередині і як його розширювати — у розділі [Для розробників](/docs/api/rest-bundle/developers). Коли доречний REST, а коли RPC, — у статті [RPC, REST та GraphQL](/articles/api/rpc_vs_rest_vs_graphql).

uk/docs/api/rest-bundle/.info.md новий файл +65 −0

1 + :::::columns border="1" zebra="1"
2 + ::::row
3 + :::col width="40%"
4 + Скачати
5 + :::
6 +
7 + :::col
8 + [Packagist](https://packagist.org/packages/ufo-tech/rest-bundle)<br>
9 + [GitHub](https://github.com/UFO-Tech/rest-bundle)
10 + :::
11 + ::::
12 +
13 + ::::row
14 + :::col width="40%"
15 + Актуальна версія
16 + :::
17 +
18 + :::col
19 + [![](https://img.shields.io/github/v/tag/ufo-tech/rest-bundle?color=blue&label=&logo=Packagist&logoColor=white&labelColor=7b8185)](https://packagist.org/packages/ufo-tech/rest-bundle)
20 + :::
21 + ::::
22 +
23 + ::::row
24 + :::col width="40%"
25 + Категорія
26 + :::
27 +
28 + :::col
29 + API
30 + :::
31 + ::::
32 +
33 + ::::row
34 + :::col width="40%"
35 + Тип
36 + :::
37 +
38 + :::col
39 + Symfony Bundle
40 + :::
41 + ::::
42 +
43 + ::::row
44 + :::col width="40%"
45 + Залежності
46 + :::
47 +
48 + :::col
49 + ![php_version](https://img.shields.io/packagist/dependency-v/ufo-tech/rest-bundle/php?logo=PHP&logoColor=white)
50 + ![json_rpc_bundle](https://img.shields.io/packagist/dependency-v/ufo-tech/rest-bundle/ufo-tech/json-rpc-bundle?label=JsonRpcBundle&logoColor=white)
51 + :::
52 + ::::
53 +
54 + ::::row
55 + :::col width="40%"
56 + Інші відомості
57 + :::
58 +
59 + :::col
60 + ![License](https://img.shields.io/badge/license-MIT-green?labelColor=7b8185)
61 + ![Size](https://img.shields.io/github/repo-size/ufo-tech/rest-bundle?label=Size%20of%20the%20repository)
62 + ![fork](https://img.shields.io/github/forks/ufo-tech/rest-bundle?color=green&logo=github&style=flat)
63 + :::
64 + ::::
65 + :::::

uk/docs/api/rest-bundle/change_log/latest.md новий файл +1 −0

1 + <include>(1.2.md)

uk/docs/api/rest-bundle/change_log/1.2.md новий файл +18 −0

1 + ## Версія 1.2
2 +
3 + Тег 1.2.0, 2026-10-16.
4 +
5 + ### Ключові зміни
6 +
7 + * Підтримка Symfony 8: `^7.2|^8.0`.
8 + * Колекція Postman будується на `AbstractPostmanAdapter` JsonRpcBundle: назва `REST: <project_name>`, для групи, відмінної від `general`, — із суфіксом ` [група]`.
9 + * `composer test` і `make test` запускають PHPUnit.
10 +
11 + ### Що врахувати
12 +
13 + * Інструменти, що шукають колекцію Postman за назвою, побачать нову назву.
14 +
15 + ### Зміни оточення
16 +
17 + * `ufo-tech/json-rpc-bundle` ^10.2.3.
18 + * Symfony ^7.2 або ^8.0.