Générer des urls avec symfony
Pour le moment nous avons que deux page, ce qui nous évite pas mal de problèmes niveau routing ! (Si vous avez gardé a route saymyname
, sinon allez la chercher dans l'étape Créer sa première route, copiez la dans votre controller et revenez ici).
Mais par contre nous n'avons pas de lien pour passer d'une à l'autre, il faut obligatoirement connaitre l'url... ce qui est plutot génant !
La technique de Kradouc
Si vous voulez pas vous embêter, et que vous savez que votre projet est mort-né vous pouvez taper toutes vos url en dur.
Par exemple so l'on modifie notre template homepage.html.twig
:
{% extends 'base.html.twig' %}
{% block title %}Homepage !{% endblock %}
{% block body %}
<h1>{{ title }}</h1>
<a href='/saymyname/aurélien'> Ma deuxième super page !</a> // Pour aurélien qui vient toujours fouiner dans les affaires des autres
{% endblock %}
Et voilà, ça marche, c'est pas terrible mais ça marche !
Sinon il y a une méthode un peu plus sympa pour les personnes décentes dans la section suivante
Générer dynamiquement des urls selon leur noms
Une url avec un nom ? 🤔
Oui, avec le système de routing de symfony permet de donner des petits noms à nos routes !
Au dela de ça, ça nous permet aussi d'appeler nos route sans avoir à se soucier de l'url, si jamais elle change ça ne cassera pas votre app web car c'est le nom qui est renseigné, GÉNIAL !
Donner un petit nom à nos routes
Pour ça ouvrez votre controller et dans la partie commentaire, ajoutez ceci :
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller
class ExempleController extends AbstractController
{
/**
* @Route("/", name="homepage") // ajout d'une propriété name
**/
public function index() {
return $this->render('index.html.twig', [
'title' => 'hello world'
]);
}
}
Grâce à cette petite modification, nous avons donné un nom à notre route pour l"utiliser dans toute l'application, vous pouvez faire pareil pout toutes les autres routes que vous avez dans votre controller.
Nommer ses route est une bonne pratique, ça vous permet de pouvoir changer l'url de la route sans impacter votre application !
Trouver le nom des routes existantes
Pour éviter d'avoir à chercher dans tous les fichiers pour le nom des routes, vous pouvez utiliser le module debug pour toutes vous les afficher !
php bin/console debug:router
ce qui va donner quelque chose comme ça :
-------------------------- -------- -------- ------ -----------------------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------------------------
_twig_error_test ANY ANY ANY /_error/{code}.{_format}
_wdt ANY ANY ANY /_wdt/{token}
_profiler_home ANY ANY ANY /_profiler/
_profiler_search ANY ANY ANY /_profiler/search
_profiler_search_bar ANY ANY ANY /_profiler/search_bar
_profiler_phpinfo ANY ANY ANY /_profiler/phpinfo
_profiler_search_results ANY ANY ANY /_profiler/{token}/search/results
_profiler_open_file ANY ANY ANY /_profiler/open
_profiler ANY ANY ANY /_profiler/{token}
_profiler_router ANY ANY ANY /_profiler/{token}/router
_profiler_exception ANY ANY ANY /_profiler/{token}/exception
_profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css
app_random_homepage ANY ANY ANY /
app_random_api ANY ANY ANY /api/
-------------------------- -------- -------- ------ -----------------------------------
Notez que des noms sont générés par défaut si vous ne les mentionnez pas, mais c'est toujours mieux d'utiliser les siens !
On retrouve pas mal de choses intéressantes dans ce tableau :
- Nom de la route
- Méthode autorisée
- Les scheme associés permettant de faire des actions (type redirection http vers https)
- Le host associé, dans le cas où votre site est réparti en plusieurs domaines
- L'uri de celle ci
Mais les choses qui vous serviront le plus sont la Name, Method et Path, le reste est assez optinnel à vrai dire.
Générer des urls simples
Pour générer des urls depuis twig, il faut utiliser la fonction path
Cette fonction path prends en argument le nom de la route où vous voulez et et génère l'url
On va faire une nouvelle route pour tester tout ça, ajoutez dans votre controller une nouvelle méthode :
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller
class ExempleController extends AbstractController
{
/**
* @Route("/", name="homepage") // ajout d'une propriété name
**/
public function index() {
return $this->render('index.html.twig', [
'title' => 'hello world'
]);
}
/**
* @Route("/test", name="nothomepage")
**/
public function nothomepage() {
return $this->render('index.html.twig', [
'title' => 'This is not homepage'
]);
}
}
Rendez vous ensuite dans le template twig index.html.twig
:
Et ajoutez ce lien dans le block body
<a href="{{ path('nothomepage') }}">Go to not the homepage</a>
Rechargez votre page, et cliquez sur lien, hop vous arrivez sur la bonne page pratique !
Pour ce qui est des routes avec des argument (cf saymyname), c'est un petit peu différent
Générer une url avec des {arguments}
C'est exactement la même chose que pour le simple, avec un petit argument en plus
Ce qui donne pour le controller :
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; // Nouveau use pour importer l'abstract controller
class ExempleController extends AbstractController
{
/**
* @Route("/", name="homepage") // ajout d'une propriété name
**/
public function index() {
return $this->render('index.html.twig', [
'title' => 'hello world'
]);
}
/**
* @Route("/test", name="nothomepage")
**/
public function nothomepage() {
return $this->render('index.html.twig', [
'title' => 'This is not homepage'
]);
}
/**
* @Route("/saymyname/{name}", name="saymyname")
**/
public function random($name) {
return new Response('Hello ' . $name . ' !');
}
}
et pour le template :
<a href="{{ path('saymyname', { name: 'Aurélien'}) }}">SAY MY NAME</a>
L'argument en plus est un petit objet clef valeur, où name ici correspond au nom du paramètre et la valeur associée correspond à ce qui va être mis à la place de name dans l'url.
Cette url donnera : www.pestopasta.com/saymyname/Aurélien
, les argument sont remplacés dynamiquements !
(www.pestopasta.com est faux, remplacez le par votre nom de domaine ou environnement local)
Le nom des arguments dépends de ce que vous mettez dans votre route au niveau du controller, vous pouvez même en avoir plusieurs !
Conclusion
Que ce soit des routes à arguments ou des routes simples, vous savez générer des url proprement pour permettre à l'utilisateur de se déplacer entre les pages de votre site !