Génère une API Resource complète avec attribut
Génère une API Resource complète pour API Platform : attribut #[ApiResource], opérations CRUD, groupes de sérialisation, validation et configuration associée.
src/Entity/{ResourceName}.php (ou modification si existant)src/ApiResource/{ResourceName}.php (si DTO séparé)IMPORTANT : Exécute ce workflow étape par étape :
$ARGUMENTS est fourni, utiliser comme nom de la resourceQuestion: "Quel est le nom de la resource API à créer ?"
Header: "Resource"
src/Entity/{ResourceName}.php#[ApiResource] à l'entité existanteQuestion: "Comment exposer la resource ?"
Header: "Stratégie"
Options:
- "Entité directe (Recommandé)" : "Attribut #[ApiResource] directement sur l'entité Doctrine"
- "DTO séparé" : "Classe DTO dédiée avec State Provider/Processor personnalisés"
Question: "Quelles opérations exposer ?"
Header: "Opérations"
Options:
- "CRUD complet" : "GetCollection, Get, Post, Put, Patch, Delete"
- "Lecture seule" : "GetCollection et Get uniquement"
- "Écriture seule" : "Post, Put, Patch, Delete uniquement"
- "Personnalisé" : "Sélection manuelle des opérations"
{resourceName}:read — Propriétés exposées en lecture (GET){resourceName}:write — Propriétés acceptées en écriture (POST/PUT/PATCH){resourceName}:list — Propriétés pour les collections (GetCollection)#[Groups] sur chaque propriétécomposer.json avec Readautoload.psr-4App par défautapi-platform dans composer.jsonLe package api-platform/core ne semble pas installé.Installation recommandée : composer require api-platform/api-packSi entité directe :
<?php
declare(strict_types=1);
namespace {namespace}\Entity;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Groups;
use Symfony\Component\Validator\Constraints as Assert;
#[ApiResource(
operations: [
new GetCollection(),
new Get(),
new Post(),
new Put(),
new Patch(),
new Delete(),
],
normalizationContext: ['groups' => ['{resourceName}:read']],
denormalizationContext: ['groups' => ['{resourceName}:write']],
)]
#[ORM\Entity]
class {ResourceName}
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
#[Groups(['{resourceName}:read'])]
private ?int $id = null;
// Propriétés avec #[Groups] et #[Assert\...]
}
Si DTO séparé :
<?php
declare(strict_types=1);
namespace {namespace}\ApiResource;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use {namespace}\State\{ResourceName}Provider;
use {namespace}\State\{ResourceName}Processor;
#[ApiResource(
operations: [
new GetCollection(provider: {ResourceName}Provider::class),
new Get(provider: {ResourceName}Provider::class),
],
provider: {ResourceName}Provider::class,
processor: {ResourceName}Processor::class,
)]
class {ResourceName}
{
public ?int $id = null;
// Propriétés du DTO
}
#[Assert\NotBlank]#[Assert\Length(max: N)]#[Assert\Email]#[Assert\Positive] si pertinentResource API {ResourceName} générée
Fichiers créés/modifiés :
- src/Entity/{ResourceName}.php (ou src/ApiResource/{ResourceName}.php)
Opérations exposées :
- GET /api/{resource_names} (collection)
- GET /api/{resource_names}/{id} (item)
- POST /api/{resource_names}
- PUT /api/{resource_names}/{id}
- PATCH /api/{resource_names}/{id}
- DELETE /api/{resource_names}/{id}
Groupes de sérialisation :
- {resourceName}:read — Lecture
- {resourceName}:write — Écriture
- {resourceName}:list — Collection
Prochaines étapes :
- Créer la migration : php bin/console make:migration
- Ajouter des filtres : /api-platform:make-filter {ResourceName}
- Générer les tests : /api-platform:make-test {ResourceName}
- Configurer la sécurité : security: "is_granted('ROLE_USER')"
#[ApiResource] avec opérations explicitessecurity sur les opérations sensibles