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
| Klasse | Einsatzfall |
|---|---|
| Response | HTML, reiner Text, oder von Twig gerendertes Markup. |
| JsonResponse | Strukturierte Daten für JavaScript/API-Clients. |
| RedirectResponse | Nach erfolgreichem POST zu einer anderen Seite weiterleiten (Post/Redirect/Get-Muster). |
| BinaryFileResponse | Eine EXISTIERENDE Datei zum Download anbieten. |
| StreamedResponse | GROSSE, dynamisch erzeugte Ausgabe ohne sie komplett im Speicher aufzubauen. |