Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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

api/src/State/ProjectSummaryProvider.php
<?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

api/src/Dto/ProjectSummary.php
<?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.