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

Response-Typen

Response-Typen

~12 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Neben der einfachen Response aus den Vorkapiteln kennt Symfony mehrere spezialisierte Response-Klassen – jede für einen konkreten, wiederkehrenden Anwendungsfall.

JsonResponse: strukturierte Daten zurückgeben

use Symfony\Component\HttpFoundation\JsonResponse;

#[Route('/projects/{id}/summary', name: 'project_summary', requirements: ['id' => '\d+'])]
public function summary(int $id): JsonResponse
{
    return $this->json([
        'id' => $id,
        'name' => 'Website-Relaunch',
        'aufgabenAnzahl' => 12,
    ]);
}

$this->json(...) (aus AbstractController) setzt automatisch Content-Type: application/json und übernimmt die JSON-Serialisierung – vorzuziehen gegenüber manuellem json_encode() plus new Response(...).

RedirectResponse: zu einer anderen Route weiterleiten

#[Route('/projects/new', name: 'project_new', methods: ['POST'])]
public function new(Request $request): Response
{
    // ... Projekt anlegen (Block 4) ...

    return $this->redirectToRoute('project_index');
}

Erinnerung an Kapitel 7: redirectToRoute() nimmt den ROUTENNAMEN entgegen, NIEMALS eine hartcodierte URL – ändert sich später der Pfad von project_index, funktioniert dieser Redirect trotzdem weiterhin korrekt.

// Mit Route-Parametern:
return $this->redirectToRoute('project_show', ['id' => $projekt->getId()]);

// Externe URL (selten nötig):
return $this->redirect('https://example.com');

BinaryFileResponse: Datei-Downloads

use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

#[Route('/projects/{id}/export', name: 'project_export', requirements: ['id' => '\d+'])]
public function export(int $id): BinaryFileResponse
{
    $dateipfad = $this->getParameter('kernel.project_dir') . '/var/exports/projekt-' . $id . '.csv';

    $response = new BinaryFileResponse($dateipfad);
    $response->setContentDisposition(
        ResponseHeaderBag::DISPOSITION_ATTACHMENT,
        sprintf('projekt-%d.csv', $id)
    );

    return $response;
}

DISPOSITION_ATTACHMENT bewirkt einen "Speichern unter"-Dialog statt einer Inline-Anzeige im Browser. $this->getParameter('kernel.project_dir') liefert den ABSOLUTEN Pfad zum Projekt-Wurzelverzeichnis – niemals einen relativen Pfad hartcodieren, der je nach Ausführungskontext unterschiedlich aufgelöst würde.

StreamedResponse: große Datenmengen ohne Speicher-Explosion

use Symfony\Component\HttpFoundation\StreamedResponse;

#[Route('/projects/export-all', name: 'project_export_all')]
public function exportAll(): StreamedResponse
{
    $response = new StreamedResponse(function () {
        $handle = fopen('php://output', 'w');
        fputcsv($handle, ['ID', 'Name']);
        foreach ($this->alleProjekteIterieren() as $projekt) {
            fputcsv($handle, [$projekt['id'], $projekt['name']]);
        }
        fclose($handle);
    });

    $response->headers->set('Content-Type', 'text/csv');
    return $response;
}

Achtung: StreamedResponse lohnt sich NUR bei GROSSEN Datenmengen, die den verfügbaren PHP-Speicher sprengen könnten – für kleine CSV-Exporte (wie unseren Aufgaben-Manager-Fall) reicht ein normaler Response mit fertig zusammengebautem Inhalt völlig aus. Frühzeitige Optimierung ohne echten Bedarf macht Code nur komplexer.

Übersicht: wann welcher Response-Typ

KlasseEinsatzfall
ResponseHTML, reiner Text, oder von Twig gerendertes Markup.
JsonResponseStrukturierte Daten für JavaScript/API-Clients.
RedirectResponseNach erfolgreichem POST zu einer anderen Seite weiterleiten (Post/Redirect/Get-Muster).
BinaryFileResponseEine EXISTIERENDE Datei zum Download anbieten.
StreamedResponseGROSSE, dynamisch erzeugte Ausgabe ohne sie komplett im Speicher aufzubauen.