Génère un State Provider API Platform pour personnaliser la récupération de données
Génère un State Provider personnalisé pour API Platform. Les providers sont responsables de la récupération des données pour les opérations de lecture (GET, GetCollection).
src/State/{ResourceName}Provider.phpIMPORTANT : Exécute ce workflow étape par étape :
$ARGUMENTS est fourni, utiliser comme nom de la resourceQuestion: "Pour quelle resource créer un State Provider ?"
Header: "Resource"
src/Entity/{ResourceName}.php ou src/ApiResource/{ResourceName}.php avec Glob/api-platform:make-resourceQuestion: "Quel type de provider créer ?"
Header: "Type"
Options:
- "Complet (Recommandé)" : "Gère à la fois les items (Get) et les collections (GetCollection)"
- "Item uniquement" : "Gère uniquement la récupération d'un item (Get)"
- "Collection uniquement" : "Gère uniquement la récupération de collections (GetCollection)"
Question: "Quelle est la source de données ?"
Header: "Source"
Options:
- "Doctrine (Recommandé)" : "Décorer le provider Doctrine existant pour ajouter de la logique"
- "Service externe" : "API tierce, microservice, ou autre source"
- "Custom" : "Logique métier complexe, agrégation de sources multiples"
composer.json avec Readautoload.psr-4App par défautProvider décorant Doctrine :
<?php
declare(strict_types=1);
namespace {namespace}\State;
use ApiPlatform\Metadata\CollectionOperationInterface;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
/**
* @implements ProviderInterface<{ResourceName}>
*/
final readonly class {ResourceName}Provider implements ProviderInterface
{
public function __construct(
private ProviderInterface $decorated,
) {
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
if ($operation instanceof CollectionOperationInterface) {
return $this->provideCollection($operation, $uriVariables, $context);
}
return $this->provideItem($operation, $uriVariables, $context);
}
private function provideCollection(Operation $operation, array $uriVariables, array $context): iterable
{
$items = $this->decorated->provide($operation, $uriVariables, $context);
// Logique personnalisée sur la collection
return $items;
}
private function provideItem(Operation $operation, array $uriVariables, array $context): ?object
{
$item = $this->decorated->provide($operation, $uriVariables, $context);
// Logique personnalisée sur l'item
return $item;
}
}
Provider depuis source externe :
<?php
declare(strict_types=1);
namespace {namespace}\State;
use ApiPlatform\Metadata\CollectionOperationInterface;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use {namespace}\ApiResource\{ResourceName};
/**
* @implements ProviderInterface<{ResourceName}>
*/
final readonly class {ResourceName}Provider implements ProviderInterface
{
public function __construct(
// Injecter le client HTTP ou le service métier
) {
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
if ($operation instanceof CollectionOperationInterface) {
// Récupérer et retourner la collection
return [];
}
// Récupérer et retourner un item
$id = $uriVariables['id'] ?? null;
return null;
}
}
config/services.yaml existe# config/services.yaml