Symfony 4 est la version du framework Symfony qui a apporté de changements majeures.

Dans ce tutoriel nous allons apprendre à faire un blog avec un système de commentaire pour les articles et un espace d’administration.

Si c’est votre première fois de faire du Symfony, je vous suggère de lire l'article sur l'Introduction de Symfony 4 avant de commencer.

Sinon, nous allons commencer tout de suite.

Installation

Avant de commencer, il nous faut d’abord créer et configurer notre projet Symfony.

Symfony utilise Composer pour la gestion des dépendances, assurez vous donc d’avoir Composer installer sur votre machine, il faut aussi vous assurez que la commande composer est disponible en l’ajoutant au PATH (vous pouvez suivre le tutoriel d'introduction sur Composer).

Maintenant installons symfony, placez vous dans le répertoire dans le quel vous voulez créer votre projet et entrez cette ligne de commande:

$ composer create-project symfony/website-skeleton blog

Nous créons ici un projet qui s’appelle blog. Si vous faites donc un ls (dir) vous devez voir un nouveau dossier blog, rendez dans ce dossier et lancer le serveur:

$ cd blog
$ php bin/console server:start

Si vous avez des problèmes avec server:start utilisez server:run comme ceci:

$ php bin/console server:run

La console nous signifie que notre site web est accessible à l’adresse http://127.0.0.1:8000, ouvrez donc ce lien dans votre navigateur, et on arrive sur cette page:

Tout va bien, notre projet est bien créer.

Configuration de l’environnement

L’une des grandes nouveautés de la version 4 de Symfony est le fichier .env qui se trouve à la racine, ce fichier contient les configurations de notre application comme les informations sur la base de données, l'environnement dans le quel on travail (dev ou prod). Ouvrons le donc:

## In all environments, the following files are loaded if they exist,
## the later taking precedence over the former:
#
##  * .env                contains default values for the environment variables needed by the app
## * .env.local          uncommitted file with local overrides
##  * .env.$APP_ENV       committed environment-specific defaults
## * .env.$APP_ENV.local uncommitted environment-specific overrides
#
## Real environment variables win over .env files.
#
## DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
#
## Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
## https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration

###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=d120bc9442daf50769276abd769df8e9
##TRUSTED_PROXIES=127.0.0.1,127.0.0.2
##TRUSTED_HOSTS='^localhost|example\.com$'
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
## Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
## For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
## Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
###< doctrine/doctrine-bundle ###

###> symfony/swiftmailer-bundle ###
## For Gmail as a transport, use: "gmail://username:password@localhost"
## For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
## Delivery is disabled by default via "null://localhost"
MAILER_URL=null://localhost
###< symfony/swiftmailer-bundle ###

Si vous lisez un peu le fichier, vous allez tout de suite comprendre à quoi sert ce fichier.

Nous avons l'environnement dans le quel on travail APP_ENV=dev on est donc en mode développement, cela va nous permettre par exemple d'avoir les erreurs afficher en clair, en bas nous avons la connexion à notre base de données DATABASE_URL dont nous allons voir un plus loin.

Les routes de notre application

Nous allons maintenant définir les routes de notre application. Nous allons pour cela utiliser le fichier config/routes.yaml. Je préfère utiliser ce fichier pour définir les routes de mon application, mais il faut savoir qu’il y a d’autres méthodes qui existent comme les annotations ou encore dans un fichier xml.

Avant de définir les routes dans le ficher routes.yaml, énumérons d’abord les routes dont on pense notre application a besoin.

  • L’accueil: c’est la rentrée de notre application et nous allons en profiter pour afficher la liste de nos articles
  • L’ajout d’un article
  • La lecture d’un article: cette page va nous permettre d’afficher un article quand on clique dessus
  • La modification d’un article
  • La suppression d’un article

Nous allons pour le moment créer ces routes, que l’on complétera au fur et à mesure. Ajoutez donc ce code au fichier routes.yaml

#config/routes.yaml

homepage:
  path: /
  controller: App\Controller\BlogController::index

article_add:
  path: /add
  controller: App\Controller\BlogController::add

article_show:
  path: /show/{url}
  controller: App\Controller\BlogController::show

article_edit:
  path: /edit/{id}
  controller: App\Controller\BlogController::edit
  requirements:
    id: '\d+'

article_remove:
  path: /remove/{id}
  controller: App\Controller\BlogController::remove
  requirements:
    id: '\d+'

Il n'y a pas trop de complications sur les 2 premières routes, l'accueil et l'ajout, ensuite nous avons la route pour afficher l'article article_show qui reçoit un paramètre qui est celui de L’URL de l'article, puis nous avons les routes article_edit et article_remove qui elles prennent plutôt l'id de l'article, et dans la section requirements on spécifie bien que l'id ne peut être qu'un entier id: '\d+'.

Alors pourquoi le choix d'utiliser l'id au lieu de L’URL sur la modification et la suppression, c'est parce que nous n'avons pas besoin de référencer ces deux pages, donc L’URL n'est pas publique contrairement à la page de vue.

Maintenant qu’on a créer nos routes, allons créer nos contrôleurs.

Les contrôleurs

Pour la petite définition, le contrôleur est juste une méthode qui va nous permettre de retourner une réponse. En gros le contrôleur reçois une requête Request et renvoie une réponse Response.

Pour créer le contrôleur, nous allons utiliser la ligne de commande, la fameuse ligne de commande de Symfony.

$ php bin/console make:controller BlogController

Nous créons le contrôleur BlogController, dans la console nous voyons bien les fichiers qui ont été créés, allons donc ouvrir le fichier BlogController.php, pour le moment tenez pas compte de l’autre fichier, nous allons y revenir

// src/Controller/BlogController.php

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends AbstractController
{
    /**
     * @Route("/blog", name="blog")
     */
    public function index(){
        return $this->render('blog/index.html.twig', [
            'controller_name' => 'BlogController',
        ]);
    }
}

La classe BlogController contient une méthode index() qui contient une docstring, cette docstring définie la route pour ce contrôleur.

Un petit problème de vocabulaire, on appelle souvent la classe BlogController le contrôleur (moi y compris), en réalité ce sont les méthodes de la classe qui sont les contrôleurs, ce sont ces méthodes qui reçoivent une requête et retourne une réponse.

Revenons donc au docstring de la méthode index(), en fait c’est ce qu’on appelle une annotation, et cette annotation définit une route qui pointe vers le contrôleur index, c’est donc une duplication vu que nous on a déjà défini nos routes dans le fichier routes.yaml, nous allons donc effacer l’annotation ainsi que le use de la classe Annotations à la ligne 6, puis on retourne une réponse avec la classe Response. Voici donc notre contrôleur:

// src/Controller/BlogController.php

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class BlogController extends AbstractController
{
    public function index()
    {
        return new Response('<h1>Page d\'accueil</h1>');
    }
}

Voilà, si vous naviguez maintenant sur http://127.0.0.1:8000 vous devez avoir ça:

Tout va bien jusque là.

Prochaine étape, nous allons définir les contrôleurs des routes que nous avons défini dans le fichier routes.yaml. Nous avons donc 4 contrôleurs de plus a ajouter. Chaque contrôleur doit retourner un objet Reponse pour le moment avec le nom de la page par exemple, ça ne devrait pas être compliqué et je compte sur vous pour essayer de le faire. On se retrouve quand vous aurez fini.

..., ..., ... ...

Voila, j’espère que vous avez réussi à le faire, corrigeons donc cela ensemble, voici à quoi ressemble mon BlogController.php

// src/Controller/BlogController.php

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class BlogController extends AbstractController
{
    public function index()
    {
        return new Response('<h1>Page d\'accueil</h1>');
    }

    public function add()
    {
    	return new Response('<h1>Ajouter un article</h1>');
    }

    public function show($url)
    {
    	return new Response('<h1>Lire l\'article ' .$url. '</h1>');
    }

    public function edit($id)
    {
    	return new Response('<h1>Modifier l\'article ' .$id. '</h1>');
    }

    public function remove($id)
    {
    	return new Response('<h1>Supprimer l\'article ' .$id. '</h1>');
    }
}

Pour le moment, dans chaque contrôleur, nous retournons un objet Response qui contient du HTML, nous verrons dans un instant comment renvoyer des pages HTML.

A ce niveau, vous devez déjà pouvoir naviguer dans votre application sans problème, retournez dans le navigateur, actualisez la page et maintenant naviguer sur les différentes routes que nous avons créées.

Accueil: http://127.0.0.1:8000

Ajouter un article: http://127.0.0.1:8000/add

Lire un article: http://127.0.0.1:8000/show/bonjour-tout-le-monde

Attention, si vous essayez d’accéder a la route http://127.0.0.1:8000/show sans mentionner L’URL de l'article à lire, vous obtenez une erreur 404 disant que la route show n'existe pas.

Modifier un article: http://127.0.0.1:8000/edit/20

Ici aussi pareil, si vous essayer d’accéder à la route edit sans l'id de l'article à supprimer http://127.0.0.1:8000/edit ou que vous envoyez une chaîne de caractères au lieu d'entier http://127.0.0.1:8000/edit/article, vous aurez une erreur 404

Supprimer un article: http://127.0.0.1:8000/remove/4

Ici aussi c'est le même fonctionnement qu'avec la route edit

Maintenant que nous avons nos routes et nos contrôleurs, dans la prochaine partie, nous allons créer nos différentes vues et les retourner au lieu de retourner de simple titre h1.

D'ici là, essayez de pratiquer en créant un nouveau projet, créer des routes et des contrôleurs et essayez de comprendre comment tout cela fonctionne.

A bientôt.

C’est fini pour ce tutoriel, si tu as des questions ou des problèmes, n'hésite pas, rends toi dans la section commentaire ci-dessous et explique nous ton problème.

Tu as aimé ce tutoriel? Partage le avec tes proches en cliquant sur les boutons ci-dessous. Sinon dis moi ce que tu n’a pas aimé, j’accepte les critiques :-)


Partager cet article

alioukahere

Mamadou Aliou Diallo

@alioukahere

Développeur web fullstack avec une passion pour l’entrepreneuriat et les nouvelles technologies. Fondateur de Kaherecode.