L’enseignement de Symfony 5 à des étudiants d’une école Tech

Kevin Nadin
Darkmira FR
Published in
6 min readJan 24, 2020

La semaine dernière, j’ai eu l’opportunité de présenter une semaine de cours sur Symfony pour des étudiants en 3ème année de l’école IPSSI, école d’Informatique Web et Digital Marketing.

Avec la sortie de Symfony 5 datant de seulement quelques jours, cela a été très intéressant pour les étudiants et moi-même d’aborder cette nouvelle version.

Le niveau des étudiants

Les étudiants qui suivent le cours sont des étudiants en alternance ayant déjà eu les cours suivants:

  • 3 jours de bases de PHP
  • 2 jours de Git
  • 2 jours de Docker
  • 5 jours de PHP Orienté Objet
  • 2 jours de Linux
  • 5 jours de JavaScript

Nous avions donc tous les pré-requis pour permettre d’aborder Symfony avec de bonnes bases.

Le plan du cours

Pour commencer nous avons commencé par les bases avec l’installation d’un projet vide:

  • Installation du skeleton symfony/website-skeleton en local
  • Ajout de fichier docker-compose.json pour faire tourner le projet avec Docker
  • Détail de l’architecture MVC installé et de son Orientation Objet

Une fois que le projet vide tournait sur tous les ordinateurs de la salle, nous avons pu commencer les choses sérieuses.

L’avantage du skeleton website est qu’il nous apporte Symfony Flex et presque tous les composants dont nous aurons besoin pour la suite de la semaine.

Le but de la semaine va être de créer un petit site de gestion d’articles, en restant très simple, on peut créer, modifier, voir et supprimer des articles dont leur auteurs peut être des utilisateurs du site (i.e. faire un CRUD sur Article). Et un utilisateur peut se connecter au site, et en fonction de ses droits il va avoir accès à plus ou moins d’options.

Doctrine

Une des plus grandes difficultés que j’ai pu voir chez moi et autour de moi est la compréhension de base de Doctrine. Étant donné que les étudiants n’auront pas de cours dédié spécialement à Doctrine, j’ai jugé important de bien prendre le temps d’aborder ce qu’est un ORM et de voir comment Doctrine va interagir avec nos Objets, et ainsi voir le principe de “Entity” et de “Repository”.

Nous avons donc commencé avec le composant Symfony maker et démarrer avec un make:entity pour créer une entité “Article”. De cette manière nous voyons les entités et repository, comment elles sont faites et comment elles interagissent entre elles pour nous permettre de récupérer des données enregistrées.

Pour construire la table correspondant à “Article” nous lançons ensuite make:migration et analysons le SQL qui a été généré pour nous, et nous voyons les commandes Doctrine disponibles pour pouvoir gérer les fichiers de migration et surtout les lancer avec doctrine:migration:migrate

Controller & Router

Nous voyons ensuite le point d’entrée de toute action, le controller, avec make:controller en précisant ArticleController, et de cette action en découle l’analyse des routes avec les annotations de Symfony.

Ensuite nous appelons en injection de dépendance la classe dont nous avons besoin, la repository de Article, pour faire une page d’index et afficher tous les Articles disponibles en base de donnée. Pour le moment, il n’y en a aucun.

Symfony Form

Et c’est là que nous commençons à entrer dans la partie Create du CRUD Article, et nous générons avec make:form un point de départ pour notre formulaire, auquel nous allons ensuite rajouter des type de champs et des options, ainsi que des conditions sur les propriétés de notre objet Article avec Symfony Validator, et nous allons générer et créer la vue du formulaire dans une nouvelle méthode de notre controller pour le renvoyer à une vue Twig

Nous voyons également de cette manière toutes les différentes façon d’afficher les champs d’un formulaire avec Twig, en passant par le global {{ form() }} pour aller jusqu’au {{ form_label() }}, {{ form_widget() }} et {{ form_errors() }}

Doctrine Relation

En suivant le même procédé, nous allons créer une entité User, lui faire un formulaire de création, et nous allons lier les articles avec les user avec la relation suivante: Un utilisateur peut avoir plusieurs Articles, et un Article ne peut avoir qu’un seul utilisateur

Point de milieu de semaine

Petit résumé sous forme de schéma de ce que nous avons vu lors de cette première partie de semaine

Une fois ces concepts bien acquis, nous continuons à voir de nouveaux modules de Symfony

Symfony Security

Une fois tout cela bien acquis, nous repartons avec un des composants les plus complexe à comprendre mais tellement utile, le Symfony Security. Nous étendons notre entité User avec “UserInterface” et intégrons les fonctions demandés par Symfony, puis nous utilisons make:auth pour nous générer un formulaire de login.

Nous ajoutons ensuite dans notre formulaire de création d’utilisateur une gestion de mot de passe en utilisant Password Encoder, sur lequel nous allons préciser la configuration dans le security.yml

Nous rajoutons alors les configurations de cryptage de mot de passe et de Provider de connexion, et notre utilisateur peut ainsi se connecter avec son email à notre site internet et consulter les articles

IsGranted et Access Role

Nous voyons ensuite les différents rôles proposé par défaut par Symfony : “ROLE_ADMIN” et “ROLE_USER”, nous leur rajoutons une hiérarchie, et mettons des vérifications de droits sur les actions de nos contrôleurs, tout en créant des actions de suppression et de modification des articles.

De même nous masquons les liens “créer” “éditer” et “supprimer” si l’utilisateur connecté ne possède pas le “ROLE_ADMIN”, en sachant que nous n’avons pas les moyens de créer un admin… encore !

Symfony Command

Nous passons ensuite à la manière de créer une commande Symfony personnalisé avec make:command pour créer un utilisateur ayant le rôle admin, en prenant en paramètre d’entrée l’email et le mot de passe.

En utilisant cette commande nous avons à présent la possibilité de nous connecter en tant qu’admin sur notre site, et ainsi de jouer efficacement avec les rôles et les droits d’accès

À cette étape de la semaine, nous avons déjà un site sur lequel nous pouvons naviguer, nous pouvons nous connecter, voir et/ou changer du contenu.

Nous rajoutons une barre de navigation pour gérer les différents liens (et éviter d’appeler les actions en tapant l’URL manuellement) et nous complétons la partie User pour avoir un CRUD complet sur ce point, en appliquant tout ce que nous avons déjà vu depuis le début.

Pour compléter le projet et voir d’autres composants de Symfony, nous rajoutons pas mal de petites actions.

Symfony Session

Pour créer ou récupérer une information et la garder en session

Symfony Flash Message

Pour envoyer à l’utilisateur des notifications unique lorsque qu’un article ou qu’un utilisateur a bien été créé.

Symfony Event & Symfony Logger

Pour ce point nous voyons en premier lieu ce qu’est le Design Pattern Observer, et nous l’appliquons sur une tâche => Logger le fait qu’un utilisateur vient d’être créé, tout en respectant la bonne pratique d’Open/Close, c’est à dire sans modifier le Controller qui se charge de créer un utilisateur

Pour ce faire nous déclenchons un événement de type Symfony Event et nous lui attachons l’entité User fraîchement créé, et nous allons ensuite récupérer cet événement avec un Event Subscriber, et déclencher une fonction qui va logger l’email, le nom et le prénom de l’utilisateur

De cette manière nous avons aussi vu comment agir en parallèle d’une action faite par un utilisateur du site.

Doctrine Fixture avec Faker

Et pour finir les travaux sur ce projet, nous voyons le composant Fixture de Doctrine pour créer des jeux de données de dev pour notre site, et pour se faire nous allons utiliser Faker pour nous permettre de remplir sans effort des entités différentes et de les persister avec Doctrine sans difficultés.

Conclusion

Avec cette semaine j’ai pu proposer des TP variés et accompagnés aux étudiants, ce qui nous a permis de construire le site petit à petit, de mon coté je poussais mon code sur git à chaque fin de journée sur une nouvelle branche de mon repo git pour permettre de repartir d’une base propre si besoin pour les étudiants, jour après jour.

En espérant qu’ils ont bien appris les bases de Symfony avec ce cours, je souhaite que cette expérience leur servent dans leur entreprise actuelle ou dans une entreprise future :)

--

--

Kevin Nadin
Darkmira FR

Développeur PHP, employé chez Darkmira et conférencier à mes heures Bénévole dans l'association JVM Events. @kevinjhappy in:kevin-nadin