docs(articles): From Magento to Symfony, a requalification guide grouped into sections
uk/articles/magento-to-symfony/data/api.md
новий файл +55
−0
1
+
# API і серіалізація
2
+
3
+
Magento генерує REST і SOAP з інтерфейсів сервісів. У Symfony є два шляхи: звичайні контролери із Serializer для контрольованого API або API Platform, коли треба швидко отримати CRUD, фільтри, пагінацію й OpenAPI з атрибута на сутності.
4
+
5
+
**Magento** · webapi.xml
6
+
7
+
```xml
8
+
<route url="/V1/faq/questions/:id" method="GET">
9
+
<service class="Vendor\Faq\Api\QuestionRepositoryInterface"
10
+
method="getById"/>
11
+
<resources>
12
+
<resource ref="anonymous"/>
13
+
</resources>
14
+
</route>
15
+
```
16
+
17
+
**Symfony** · контролер + групи серіалізації
18
+
19
+
```php
20
+
use Symfony\Component\Serializer\Attribute\Groups;
21
+
22
+
class Question
23
+
{
24
+
#[Groups(['question:read'])]
25
+
private ?int $id = null;
26
+
27
+
#[Groups(['question:read'])]
28
+
private string $title;
29
+
}
30
+
31
+
#[Route('/api/questions/{id}', methods: ['GET'])]
32
+
public function show(Question $question): JsonResponse
33
+
{
34
+
return $this->json($question, context: [
35
+
'groups' => ['question:read'],
36
+
]);
37
+
}
38
+
```
39
+
40
+
**Symfony** · API Platform: найближче до автогенерації
41
+
42
+
```php
43
+
#[ApiResource(
44
+
operations: [
45
+
new Get(),
46
+
new GetCollection(),
47
+
new Post(security: "is_granted('ROLE_FAQ_EDITOR')"),
48
+
],
49
+
normalizationContext: ['groups' => ['question:read']],
50
+
)]
51
+
#[ORM\Entity]
52
+
class Question { /* … */ }
53
+
```
54
+
55
+
Віддавати сутності напряму зручно, але публічний API краще будувати на окремих DTO, щоб зміна схеми БД не ламала контракт. GraphQL: API Platform або `overblog/graphql-bundle`.