Créer une route en Symfony 4

Pour réaliser une page web, déterminée par une adresse url, il vous faudra d’abord créer une route, ceci permet de gérer le traitement de l’entrée de l’adresse url jusqu’au controller

Définir une route avec le fichier YAML routes.yaml. Attention il existe un second fichier un peu semblable routing.yaml, ce dernier fichier ne contient pas de définition de routes http. C’est le fichier de configuration du composant de routage (le router).

#routes.yaml
app_contact
    path: /contact
    controller: App\Controller\ContactController::index

La syntaxe YAML est très minimaliste et il faut faire attention à l’indentation, une mauvaise indentation fait résulter en un erreur de l’application ! Ici app_contact est le nom de la route, la seconde ligne est la correspondance dans la barre d’adresse du navigateur (le nom de domaine est omis), et la troisième ligne décrit le controller qui va s’occuper du traitement de la page.

Donc en premier il nous faut créer un controller, et pour ce faire on va utiliser la ligne de commande

php bin/console make:controller ContactController

Vous aurez une erreur du type « There are no commands defined in the « make » namespace. « , on remarque le mot namespace, c’est au même titre que le namespace de PHP, à priori il nous manque un bundle, en googlant on apprend que c’est un composant de Doctrine, l’ORM en titre de Symfony. On va installer ça (mais avant d’exécuter la commande versionnez le code avec GIT pour voir les modification générée sur le fichier composer.json.

composer require doctrine maker

Cette commande ci-dessus utilise Flex, le nouveau système intégré de Symfony 4 pour télécharger les packages. Une fois exécuté, faites un git status pour voir les nouveau fichiers apparu suite à cette commande. On remarque qu’il n’est pas listé de fichier dans le répertoire vendor/ car dans le fichier .gitignore par défaut généré lorsqu’on a créé l’application Symfony, ce répertoire est ignoré.

 git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   .env
	modified:   composer.json
	modified:   composer.lock
	modified:   config/bundles.php
	modified:   symfony.lock

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	config/packages/doctrine.yaml
	config/packages/doctrine_migrations.yaml
	config/packages/prod/
	config/routes/
	src/Entity/
	src/Migrations/
	src/Repository/

Regardez en détail si vous êtes curieux (j’espère pour vous !) des fichiers existants modifiés, .env, composer.json, config/bundles.php, symfony.lock . On remarquera notamment qu’il y a une nouvelle ligne concernant la connexion à la base de données dans le fichier .env, et dans composer.json, il y a les lignes ajoutées qui correspondent au composant que vous avez ajoutés, le maker-bundle et orm-pack . Autre fichier très important, le fichier config/bundles.php , où sont enregistrés les packages installés. Dans la foulée, il y a eu aussi installation de orm-pack qui vous servira a communiquer avec le base de données. Committez les changement une fois fini.

Création du controller en ligne de commande

php bin/console make:controller Contactcontroller

Et même chose regardez ce qui est nouveau par rapport au commit précédent.

    public function index()
    {
        return new Response(
            '<html><body>Lucky message : Hello !</body></html>'
        );
    }

Ajoutez le bout de code ci-dessus, il est possible que vous ayez un commentaire de ce genre :

    /**
     * @Route("/contact", name="contact")
     */

Lors de l’installation précédente, le bundle annotations a été installé, les annotations sont une façon de mettre du code sous la forme @texte ici le texte est une route, on va l’enlever car on a défini la route dans le routes.yaml . Maintenant il est temps d’aller sur le navigateur et entrer la route après votre nom de domaine local (localhost ou tout autre host que vous aurez défini). Si vous avez l’erreur :

Attempted to load class "Response" from namespace "App\Controller". Did you forget a "use" statement for e.g. "Symfony\Flex\Response" or "Symfony\Component\HttpFoundation\Response"?

Le message vous dit qu’il manque une référence à la classe Response, aussi ajoutez dans le fichier ContactController la ligne ci-dessous et rechargez la page !

use Symfony\Component\HttpFoundation\Response;

Félicitations ! vous avez fait votre première pages web sous Symfony 4 !