Installation Add the package via Composer:
composer require api-platform/doctrine-orm
Ensure api-platform/core is installed (this package extends its functionality).
Basic Usage The package provides Doctrine ORM integration for API Platform, enabling seamless CRUD operations with Doctrine entities. No extra configuration is needed if you're already using API Platform with Doctrine.
First Use Case
use ApiPlatform\Metadata\ApiResource;
use Doctrine\ORM\Mapping as ORM;
#[ApiResource]
#[ORM\Entity]
class Book
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
#[ApiPlatform\Metadata\Get]
public ?int $id = null;
#[ORM\Column]
public string $title;
}
/api/books (auto-generated by API Platform).Standard CRUD Operations
GET, POST, PUT, DELETE) for annotated entities.GET /api/books
Customizing Operations
operation metadata:
#[ApiResource(
operations: [
new Get(collection: false),
new Post(
processor: BookPostProcessor::class,
validationContext: ['groups' => ['book_validation']]
)
]
)]
Filtering & Pagination
DateFilter, BooleanFilter) via ApiPlatform\Doctrine\Orm\Filter\*.#[ApiResource(
filters: [new BooleanFilter(field: 'isActive')]
)]
Serialization Groups
#[Groups]:
use Symfony\Component\Serializer\Annotation\Groups;
#[Groups(['book:read'])]
public string $title;
Event Listeners
prePersist, postRemove) via Doctrine event subscribers or API Platform’s #[ApiResource] events:
#[ApiResource(
events: [
'prePersist' => [BookEventSubscriber::class, 'prePersist']
]
)]
DQL & Native Queries
#[ApiResource] with collectionOperations for custom queries:
#[ApiResource(
collectionOperations: [
new Get(
uriTemplate: '/books/active',
method: 'GET',
normalizationContext: ['groups' => ['book:read']],
requirements: ['active' => '1'],
controller: BookController::class,
read: false
)
]
)]
Circular References
#[Groups] or #[MaxDepth]:
#[MaxDepth(1)]
public Author $author;
Doctrine vs. API Platform State
ApiPlatform\Core\Serializer\SerializerContextBuilder, which may override Doctrine’s default serialization. Explicitly set serialization_context in operations if needed.Filter Conflicts
SearchFilter) may conflict with API Platform’s built-in filters. Ensure unique filter names or disable duplicates in config:
# config/packages/api_platform.yaml
api_platform:
formats:
jsonld:
mime_types: ['application/ld+json']
doctrine:
orm:
filters: ~ # Override or extend default filters
Performance with Large Datasets
#[ApiResource(paginationItemsPerPage: 20)] or implement custom pagination.Validation Groups
validationContext in operations may lead to silent failures. Always define groups:
new Post(validationContext: ['groups' => ['book_validation']])
Enable API Platform Debug Toolbar
api-platform/core with debug mode:
composer require api-platform/core --dev
config/packages/dev/api_platform.yaml:
api_platform:
debug: true
Check Serialization Context
dd($context) in a custom controller to inspect serialization groups, formats, or filters.Doctrine Query Logging
config/packages/dev/doctrine.yaml:
doctrine:
dbal:
logging: true
profiling: true
Common Errors
#[ApiResource] is applied to the entity.validationContext groups exist in your validator constraints.#[Groups] or circular references.Custom Controllers
#[ApiResource(
collectionOperations: [
new Get(controller: CustomBookController::class)
]
)]
Dynamic Metadata
ApiPlatform\Metadata\Factory\MetadataFactoryInterface to dynamically generate resource metadata.Event Subscribers
#[ApiResource] events:
#[ApiResource(
events: [
'postPersist' => [BookSubscriber::class, 'onPostPersist']
]
)]
Custom Serializers/Deserializers
Symfony\Component\Serializer\Normalizer\NormalizerInterface or DenormalizerInterface for custom logic.Hybrid APIs
GraphQlResource for GraphQL support alongside REST.How can I help you explore Laravel packages today?