Hostinger

Les paramètres d’URL et les requêtes !

Comme dans toute application, il est essentiel de pouvoir récupérer les informations envoyées par l’utilisateur.

Ces données peuvent être transmises via une requête, que ce soit par une URL, un formulaire ou encore à travers une requête HTTP (POST, ...).

Heureusement, Symfony simplifie grandement cette manipulation grâce à un objet dédié : la classe Request ! 👌

Les paramètres d'URL dans Symfony

Paramètres dynamiques dans une route

Nous avons déjà vu ensemble ce point dans la leçon sur le routeur de Symfony.

En effet, les routes Symfony peuvent contenir des paramètres dynamiques. Ils permettent de capturer des valeurs depuis l’URL et de les transmettre au contrôleur.

Rappelez-vous dans src/Controller/HelloController.php

// ...
#[Route('/article/{id}', name: 'app_article_show')]
public function show(int $id): Response
{
    return new Response('Affichage de l\'article avec l\'ID : ' . $id);
}

Si l’utilisateur visite l’URL /article/10, Symfony passera automatiquement 10 au paramètre $id du contrôleur.

Contraintes

Les contraintes dans Symfony permettent de contrôler les valeurs autorisées pour les paramètres.

Voici un exemple de contrainte :

// ...
#[Route('/article/{id}', name: 'app_article_show', requirements: ['id' => '\d+'])]
public function show(int $id): Response
{
    return new Response('Affichage de l\'article avec l\'ID : ' . $id);
}

Ici, nous utilisons le mot-clé requirements et une expression régulière qui indique que id doit être un nombre entier positif.

Voici une liste des contraintes les plus utilisées (Regex) :

  • \d+ → Un ou plusieurs chiffres (entier positif)
  • \d{4} → Exactement 4 chiffres (souvent pour une année)
  • [a-zA-Z]+ → Lettres uniquement (majuscules ou minuscules)
  • [a-z0-9-]+ → Lettres minuscules, chiffres et tirets (pour les slugs)
  • [A-Za-z0-9_]+ → Alphanumérique avec underscores

L'objet Request pour du POST

Grâce à l'objet Request de Symfony, on pourra récupérer des données transmises en POST via un formulaire.

Nous allons créer une nouvelle route dans notre contrôleur src/Controller/HelloController.php.

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

final class HelloController extends AbstractController
{

    #[Route('/hello', name: 'app_hello')]
    public function index(): Response
    {

        $nom = 'Dupont';
        $age = 30;
        $ville = 'Paris';

        $hobbies = ['Lecture', 'Voyage', 'Cinéma'];

        return $this->render('hello/index.html.twig', [
            'nom' => $nom,
            'age' => $age,
            'ville' => $ville,
            'hobbies' => $hobbies,
        ]);
    }

    #[Route('/articles', name: 'app_articles')]
    public function list(): Response
    {
        return new Response('Liste des articles');
    }

    #[Route('/article/{id}', name: 'app_article_show')]
    public function show(int $id): Response
    {
        return new Response('Affichage de l\'article avec l\'ID : ' . $id);
    }

    #[Route('/bonjour', name: 'app_bonjour', methods: ['GET', 'POST'])]
    public function bonjour(Request $request): Response
    {
        $nom = $request->request->get('nom');
        
        return $this->render('bonjour/index.html.twig', [
            'nom' => $nom,
        ]);
    }

}

Et nous allons ensuite créer la vue associée dans templates/bonjour/index.html.twig et y insérer un formulaire simple :

<h1>Formulaire de salutation</h1>

<form method="post">
    <input type="text" name="nom" placeholder="Votre nom">
    <button type="submit">Dire bonjour</button>
</form>

{% if nom %}
  <p>Bonjour {{ nom }} ! Ravi de vous voir.</p>
{% endif %}

Dans notre contrôleur, on utilise l'injection automatique des paramètres pour manipuler les requêtes reçues : Request $request.

Grâce au autowiring de Symfony, nous pouvons maintenant récupérer des informations transmises l'utilisateur via un formulaire grâce à $request.

Pour être plus précis, dans notre formulaire, pour récupérer le nom (name="nom"), dans le contrôleur, on doit taper :

$nom = $request->request->get('nom');

Il est possible également de récupérer toutes les données envoyées d'un coup.

$tous = $request->request->all();

Pour terminer cette section, je vous propose de regarder un fichier dans notre projet : .env.