API Platform Symfony REST: Tutorial Lengkap dan Pertanyaan Interview 2026
Panduan lengkap API Platform Symfony untuk membangun REST API modern. Pelajari instalasi, konfigurasi, operasi CRUD, dan pertanyaan interview 2026.

API Platform merupakan framework PHP paling populer untuk membangun API modern berbasis Symfony. Framework ini menyediakan berbagai fitur out-of-the-box seperti dokumentasi OpenAPI, pagination, filtering, dan validation. Artikel ini membahas cara menggunakan API Platform untuk membangun REST API yang scalable dan production-ready.
API Platform 4.x memperkenalkan state providers dan processors baru yang menggantikan data providers lama. Pastikan menggunakan versi terbaru untuk mendapatkan semua fitur modern.
Instalasi API Platform di Symfony
Langkah pertama adalah menginstal API Platform menggunakan Composer. Framework ini terintegrasi sempurna dengan Symfony 7 dan menyediakan bundle yang siap digunakan.
composer create-project symfony/skeleton my-api
cd my-api
composer require apiSetelah instalasi, API Platform secara otomatis mengkonfigurasi routes dan dokumentasi. Konfigurasi dasar dapat ditemukan di file config/packages/api_platform.yaml.
# config/packages/api_platform.yaml
api_platform:
title: 'My API'
version: '1.0.0'
formats:
jsonld: ['application/ld+json']
json: ['application/json']
defaults:
stateless: true
cache_headers:
vary: ['Content-Type', 'Authorization', 'Origin']
swagger:
versions: [3]Membuat Resource API Pertama
API Platform menggunakan PHP attributes untuk mendefinisikan resources. Setiap entity yang ditandai dengan #[ApiResource] secara otomatis mendapatkan endpoints CRUD.
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use ApiPlatform\Metadata\Delete;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity]
#[ApiResource(
operations: [
new GetCollection(),
new Get(),
new Post(),
new Put(),
new Delete()
],
paginationItemsPerPage: 20
)]
class Product
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
#[Assert\NotBlank]
#[Assert\Length(min: 3, max: 255)]
private string $name;
#[ORM\Column(type: 'text')]
private string $description;
#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
#[Assert\Positive]
private string $price;
#[ORM\Column]
private \DateTimeImmutable $createdAt;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
}
// Getters and setters...
}Filtering dan Sorting Data
API Platform menyediakan berbagai filter bawaan yang dapat diaktifkan dengan mudah. Filter memungkinkan client untuk query data berdasarkan kriteria tertentu.
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter;
use ApiPlatform\Doctrine\Orm\Filter\DateFilter;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ApiResource]
#[ApiFilter(SearchFilter::class, properties: [
'name' => 'partial',
'description' => 'partial',
'category.name' => 'exact'
])]
#[ApiFilter(OrderFilter::class, properties: ['name', 'price', 'createdAt'])]
#[ApiFilter(RangeFilter::class, properties: ['price'])]
#[ApiFilter(DateFilter::class, properties: ['createdAt'])]
class Product
{
// Properties...
}Contoh query menggunakan filter:
# Mencari produk dengan nama mengandung "laptop"
GET /api/products?name=laptop
# Filter berdasarkan range harga
GET /api/products?price[gte]=100&price[lte]=500
# Sorting berdasarkan harga descending
GET /api/products?order[price]=descValidasi dan Serialization Groups
Validasi di API Platform menggunakan Symfony Validator component. Serialization groups memungkinkan kontrol granular terhadap data yang dikembalikan.
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity]
#[ApiResource(
normalizationContext: ['groups' => ['product:read']],
denormalizationContext: ['groups' => ['product:write']],
operations: [
new GetCollection(normalizationContext: ['groups' => ['product:list']]),
new Get(normalizationContext: ['groups' => ['product:read', 'product:detail']]),
new Post()
]
)]
class Product
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
#[Groups(['product:read', 'product:list'])]
private ?int $id = null;
#[ORM\Column(length: 255)]
#[Assert\NotBlank(message: 'Product name is required')]
#[Groups(['product:read', 'product:list', 'product:write'])]
private string $name;
#[ORM\Column(type: 'text')]
#[Groups(['product:read', 'product:detail', 'product:write'])]
private string $description;
#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
#[Assert\Positive(message: 'Price must be positive')]
#[Groups(['product:read', 'product:list', 'product:write'])]
private string $price;
// Getters and setters...
}State Providers dan Processors
API Platform 4 memperkenalkan State Providers dan Processors untuk custom logic. Ini menggantikan Data Providers dan Data Persisters dari versi sebelumnya.
<?php
namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Repository\ProductRepository;
class ProductStateProvider implements ProviderInterface
{
public function __construct(
private ProductRepository $repository
) {}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
if (isset($uriVariables['id'])) {
return $this->repository->find($uriVariables['id']);
}
return $this->repository->findActiveProducts();
}
}State Processor untuk custom logic saat menyimpan data:
<?php
namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mailer\MailerInterface;
class ProductProcessor implements ProcessorInterface
{
public function __construct(
private EntityManagerInterface $em,
private MailerInterface $mailer
) {}
public function process(
mixed $data,
Operation $operation,
array $uriVariables = [],
array $context = []
): mixed {
$this->em->persist($data);
$this->em->flush();
// Send notification email
$this->sendNotification($data);
return $data;
}
private function sendNotification(object $product): void
{
// Email logic...
}
}Autentikasi dan Otorisasi
API Platform terintegrasi dengan Symfony Security untuk autentikasi JWT atau API token.
# config/packages/security.yaml
security:
firewalls:
api:
pattern: ^/api
stateless: true
jwt: ~
access_control:
- { path: ^/api/docs, roles: PUBLIC_ACCESS }
- { path: ^/api/products, roles: PUBLIC_ACCESS, methods: [GET] }
- { path: ^/api, roles: ROLE_USER }Menggunakan security di level resource:
<?php
namespace App\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Delete;
#[ApiResource(
operations: [
new Get(),
new Post(security: "is_granted('ROLE_ADMIN')"),
new Delete(
security: "is_granted('ROLE_ADMIN') or object.owner == user",
securityMessage: "Only admin or owner can delete this resource"
)
]
)]
class Product
{
// Properties...
}Testing API Endpoints
Pengujian API sangat penting untuk memastikan endpoints berfungsi dengan benar. Symfony menyediakan WebTestCase untuk functional testing.
<?php
namespace App\Tests\Api;
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;
class ProductApiTest extends ApiTestCase
{
private EntityManagerInterface $em;
protected function setUp(): void
{
$this->em = self::getContainer()->get('doctrine')->getManager();
}
public function testGetProducts(): void
{
$response = static::createClient()->request('GET', '/api/products');
$this->assertResponseIsSuccessful();
$this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
$this->assertJsonContains(['@type' => 'hydra:Collection']);
}
public function testCreateProduct(): void
{
$response = static::createClient()->request('POST', '/api/products', [
'json' => [
'name' => 'New Product',
'description' => 'Product description',
'price' => '99.99'
],
'headers' => [
'Authorization' => 'Bearer ' . $this->getToken()
]
]);
$this->assertResponseStatusCodeSame(201);
$this->assertJsonContains(['name' => 'New Product']);
}
public function testValidationError(): void
{
$response = static::createClient()->request('POST', '/api/products', [
'json' => [
'name' => '',
'price' => -10
]
]);
$this->assertResponseStatusCodeSame(422);
}
}Pertanyaan Interview API Platform 2026
Berikut adalah pertanyaan-pertanyaan yang sering muncul dalam interview terkait API Platform:
1. Apa perbedaan antara State Provider dan Data Provider?
State Provider adalah pendekatan baru di API Platform 4 yang lebih fleksibel. Data Provider sudah deprecated dan digantikan oleh State Provider yang mendukung async operations dan better type safety.
2. Bagaimana cara implement pagination custom?
Pagination dapat dikustomisasi melalui konfigurasi resource atau dengan membuat custom Paginator yang mengimplementasikan PaginatorInterface.
3. Jelaskan perbedaan normalization dan denormalization context?
Normalization context digunakan saat data dikonversi dari object ke array/JSON (response). Denormalization context digunakan saat data dikonversi dari JSON ke object (request).
4. Bagaimana cara handle relasi di API Platform?
Relasi dapat di-expose sebagai IRI (referensi) atau embedded object menggunakan serialization groups. Untuk operasi nested, gunakan subresource atau custom operations.
5. Apa itu OpenAPI dan bagaimana API Platform menggunakannya?
OpenAPI (sebelumnya Swagger) adalah spesifikasi untuk dokumentasi API. API Platform secara otomatis menggenerate dokumentasi OpenAPI berdasarkan metadata resources.
Siap menguasai wawancara Symfony Anda?
Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.
Kesimpulan
API Platform menyediakan solusi lengkap untuk membangun REST API dengan Symfony. Dengan fitur seperti automatic CRUD operations, filtering, pagination, dan dokumentasi OpenAPI, developer dapat fokus pada business logic tanpa perlu menulis boilerplate code. Pemahaman mendalam tentang State Providers, Processors, dan serialization groups sangat penting untuk memanfaatkan API Platform secara maksimal dalam proyek production.
Bisakah kamu menemukan bug di Symfony?
Satu potongan kode nyata, satu bug tersembunyi, satu percobaan per hari. Tanpa akun untuk mencoba.

Ditulis oleh
Anthony Fillion-MailletPendiri SharpSkill
Developer fullstack selama lebih dari 10 tahun. Ia menjalankan SharpSkill dan bertanggung jawab atas semua yang diterbitkan di sini.
Diperbarui 25 Agustus 2026
Bagikan
Artikel terkait

Keamanan REST API Symfony di 2026: OAuth2, Rate Limiting, dan Pertanyaan Interview
Pelajari cara mengamankan REST API Symfony dengan OAuth2 token introspection, rate limiting, dan validasi JWT. Membahas fitur keamanan Symfony 7.3, kerentanan umum, dan pertanyaan interview teknis.

API Platform dengan Symfony 2026: Arsitektur Modern dan Pertanyaan Wawancara
Panduan lengkap API Platform dengan Symfony di 2026, membahas arsitektur SmartPlatform, State Providers, custom filters, dan pertanyaan wawancara teknis untuk developer.

API Platform GraphQL Symfony: Skema, Mutasi, dan Pertanyaan Interview 2026
Panduan lengkap integrasi API Platform GraphQL dengan Symfony. Pelajari skema otomatis, mutasi, resolver kustom, keamanan, dan pertanyaan interview teknis untuk developer 2026.