Een controller is de schakel tussen de route en de gebruiker. Hij ontvangt het HTTP-verzoek, voert logica uit (bijv. data ophalen), en stuurt een antwoord terug. In deze les leer je hoe je controllers bouwt in Symfony.
1 Wat doet een controller?
Vergelijk een controller met een ober in een restaurant: hij ontvangt jouw bestelling (verzoek), gaat naar de keuken (logica/database), en brengt het eten terug (antwoord).
2 De basisstructuur van een controller
Elke controller is een gewone PHP-klasse die AbstractController overerft. Die basisklasse geeft je handige hulpfuncties zoals render() en redirectToRoute().
<?php
namespace App\Controller;
// Importeer de benodigde klassen
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
// De klasse erft van AbstractController
class ProductController extends AbstractController
{
#[Route('/producten', name: 'product_index')]
public function index(): Response
{
// render() zoekt het template op in templates/
return $this->render('product/index.html.twig', [
'titel' => 'Alle producten',
]);
}
}
ProductController en staat in src/Controller/ProductController.php. Symfony verwacht dat de bestandsnaam en klassenaam overeenkomen.
3 Return types: wat kun je teruggeven?
Een controller-methode geeft altijd een Response-object terug. Er zijn drie veelgebruikte varianten:
// Render een Twig-template en stuur HTML terug
return $this->render('product/index.html.twig', [
'producten' => $alleProducten,
]);
// Stuur de gebruiker door naar een andere route
return $this->redirectToRoute('product_index');
// Met een parameter:
return $this->redirectToRoute('product_detail', ['id' => 5]);
// Stuur JSON terug (handig voor API-endpoints)
return $this->json([
'naam' => 'Laptop',
'prijs' => 999.99,
]);
4 Flash messages: feedback aan de gebruiker
Na een actie (bijv. een product opslaan) wil je de gebruiker feedback geven. Dat doe je met een flash message — een eenmalig bericht dat na één paginalading verdwijnt.
#[Route('/producten/opslaan', name: 'product_opslaan', methods: ['POST'])]
public function opslaan(): Response
{
// ... opslaan in database ...
// Voeg een flash message toe
$this->addFlash('success', 'Product succesvol opgeslagen!');
// Stuur door naar de lijst
return $this->redirectToRoute('product_index');
}
{% for bericht in app.flashes('success') %}
<div class="alert alert-success">{{ bericht }}</div>
{% endfor %}
{% for bericht in app.flashes('error') %}
<div class="alert alert-danger">{{ bericht }}</div>
{% endfor %}
5 Oefenen: bouw een complete controller
Maak een controller met twee acties: één voor de lijst en één voor het detail van een product. Gebruik render() en redirectToRoute().
📋 Samenvatting
- ✓ Een controller is een PHP-klasse die
AbstractControllerovererft - ✓ Elke methode geeft een
Response-object terug - ✓
render()laadt een Twig-template en geeft HTML terug - ✓
redirectToRoute()stuurt de gebruiker door naar een andere pagina - ✓
addFlash()geeft de gebruiker éénmalige feedback na een actie
Kennischeck
Test of je de stof begrepen hebt
Klaar met deze les? Markeer hem als voltooid!