Annotations in Symfony

Routeren in Symfony

Routeren in Symfony kan op twee manieren. Het kan via een configuratie bestand config/routes.yaml of config/routes.php of het kan via annotation.
Voor beide oplossingen is wat te zeggen. Het voordeel van een routes-bestand is dat je alle routes bij elkaar hebt en je snel kan zien waar een route heen gaat, maar je moet dan altijd de betreffende Controller opzoeken.
Bij de Annotation oplossing staan de routes boven de functies in je Controller. Dit is binnen een controller overzichtelijk en als je logisch programmeert ook snel en goed te vinden. Het nadeel is dat je niet een bestand hebt als oplossing voor je routes.

Op MBO-SD gebruiken we de Annotation oplossing

Binnen MBO-SD gebruiken we de Annotation oplossing. Je zult dus in de Controllers de routes terug vinden. Boven elke functie die bij een route hoort zal je een stuk code zien staan.
In de Use sectie van je Controller moet je de Route optie aangeven om te gebruiken. Dit doe je door de volgende Use-statement op te nemen:
use Symfony\Component\Routing\Attribute\Route;
Als jouw Symfony project in de basis gemaakt is met de --webapp parameter zal dit standaard het geval zijn.
Daarna kan je jouw route boven een functie zetten in jouw Controller(s)

Maak vooraf een overzicht van je routes en controllers

Het is belangrijk om goed over jouw routes en oplossingen na te denken en voor je gaat programmeren te starten met alle routes en Controllers in kaart te brengen en in een tabel te zetten. Zo weet je welke routes je nodig hebt en kan je alles logisch in elkaar knutsellen.

Hoe werkt Annotation

Bij Annotation zet je boven een functie de route met eventueel extra informatie neer.

#[Route('/book', name: 'app_book')]
public function index(): Response
{
    return $this->render('book/index.html.twig', [
        'controller_name' => 'BookController',
    ]);
}
Voorbeeld van een functie met daarboven de Annotation voor de route
In het bovenstaande voorbeeld zie je dat er een route is naar /book de naam van de route is app_book . Deze naam kan je later gebruiken om naar de juiste route te verwijzen.

Meer informatie over de werking van de routes en hoe je ze in jouw Controller gebruikt vind je in de volgende paragraaf.

Overzicht van alle routes

In Symfony kan je met een termninal-commando alle routes tonen die er zijn en wat de naam van de route is
symfony console debug:router

# symfony console debug:router

----------------  -------  -------  -----  --------------------------------------------
Name              Method   Scheme   Host   Path
----------------  -------  -------  -----  --------------------------------------------
homepage          ANY      ANY      ANY    /
contact           GET      ANY      ANY    /contact
contact_process   POST     ANY      ANY    /contact
article_show      ANY      ANY      ANY    /articles/{_locale}/{year}/{title}.{_format}
blog              ANY      ANY      ANY    /blog/{page}
blog_show         ANY      ANY      ANY    /blog/{slug}
----------------  -------  -------  -----  --------------------------------------------

Meer informatie over een route

Je kan ook met de naam van een route met dit commando meer informatie ophalen, bijvoorbeeld in welke Controller de route gemaakt is. Dit doe je door de naam van de route toe te voegen aan het commando.

# symfony console debug:router app_book
+--------------+---------------------------------------------------------+
| Property     | Value                                                   |
+--------------+---------------------------------------------------------+
| Route Name   | app_book                                                |
| Path         | /book/{book}                                            |
| Path Regex   | {^/book/(?P<book>[^/]++)$}sDu                           |
| Host         | ANY                                                     |
| Host Regex   |                                                         |
| Scheme       | ANY                                                     |
| Method       | ANY                                                     |
| Requirements | NO CUSTOM                                               |
| Class        | Symfony\Component\Routing\Route                         |
| Defaults     | _controller: App\Controller\BookController::index()     |
| Options      | compiler_class: Symfony\Component\Routing\RouteCompiler |
|              | utf8: true                                              |
+--------------+---------------------------------------------------------+