Das versprochene DTO-Beispiel vervollständigen
Das versprochene DTO-Beispiel vervollständigen
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Kapitel 27 zeigte ProjectSummary NUR als Konzept, OHNE funktionierenden Provider – MIT dem Wissen aus Kapitel 57 lässt sich das JETZT VOLLSTÄNDIG nachholen.
Die Operation vollständig definieren
use App\Dto\ProjectSummary;
use App\State\ProjectSummaryProvider;
new Get(
uriTemplate: '/projects/{id}/summary',
output: ProjectSummary::class,
provider: ProjectSummaryProvider::class,
),Den Provider implementieren
<?php
declare(strict_types=1);
namespace App\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
use App\Dto\ProjectSummary;
use App\Repository\ProjectRepository;
final class ProjectSummaryProvider implements ProviderInterface
{
public function __construct(
private readonly ProjectRepository $projectRepository,
) {
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?ProjectSummary
{
$project = $this->projectRepository->find($uriVariables['id']);
if (null === $project) {
return null;
}
$summary = new ProjectSummary();
$summary->id = $project->getId();
$summary->name = $project->getName();
$summary->isRecent = $project->isRecent();
$summary->taskCount = $project->getTasks()->count();
$summary->openTaskCount = $project->getTasks()
->filter(fn ($task) => !$task->isDone())
->count();
return $summary;
}
}$uriVariables['id'] enthält den {id}-Platzhalter aus dem uriTemplate – GENAU der Mechanismus aus Kapitel 39, jetzt MANUELL statt über Link ausgewertet, da ProjectSummary KEINE eigene Doctrine-Entity ist.
Das DTO um die neuen Felder erweitern
<?php
declare(strict_types=1);
namespace App\Dto;
final class ProjectSummary
{
public int $id;
public string $name;
public bool $isRecent;
public int $taskCount;
public int $openTaskCount;
}Den Endpunkt testen
curl -k https://localhost/api/projects/1/summary -H "Authorization: Bearer $TOKEN"{
"id": 1,
"name": "Website-Relaunch",
"isRecent": true,
"taskCount": 5,
"openTaskCount": 3
}EIN einzelner Endpunkt, der Daten aus MEHREREN Quellen (Project-Felder PLUS berechnete Task-Statistiken) in EINER flachen Antwort KOMBINIERT – GENAU der Anwendungsfall, den Kapitel 27 als Grund für DTOs statt Gruppen NANNTE.
Achtung: getTasks()->count() lädt die GESAMTE Tasks-Collection aus der Datenbank, NUR um sie zu ZÄHLEN – bei VIELEN Tasks wäre eine dedizierte COUNT-Query (über den Repository) EFFIZIENTER. Für UNSER Lernbeispiel bleibt die EINFACHE Variante bewusst bestehen.
Tipp: DIESES Kapitel schließt den in Kapitel 27 offen gelassenen Kreis – ein GUTES Beispiel dafür, wie diese Schulung bewusst VORAUSVERWEIST und SPÄTER VERVOLLSTÄNDIGT, statt jedes Konzept SOFORT bis ins letzte Detail zu erklären.