Les 3: Controllers
HomeLes 3

🎮 Controllers

⏱ Geschatte leestijd: 20 minuten · 5 stappen

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).

🌐
Request
GET /producten
🎮
Controller
Logica uitvoeren
📄
Response
HTML pagina

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().

src/Controller/ProductController.php
<?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',
        ]);
    }
}
📌 Naamgeving: De klasse heet 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:

1. HTML via Twig (meest gebruikt)
// Render een Twig-template en stuur HTML terug
return $this->render('product/index.html.twig', [
    'producten' => $alleProducten,
]);
2. Redirect naar een andere pagina
// Stuur de gebruiker door naar een andere route
return $this->redirectToRoute('product_index');

// Met een parameter:
return $this->redirectToRoute('product_detail', ['id' => 5]);
3. JSON (voor API's)
// 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.

src/Controller/ProductController.php
#[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');
}
templates/base.html.twig — flash messages tonen
{% 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().

src/Controller/SmartphoneController.php
Klik op "Controleer" om je code te testen...

📋 Samenvatting

  • Een controller is een PHP-klasse die AbstractController overerft
  • 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!