API і серіалізація

← API і серіалізація

Ashterix

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`.