Le framework Symfony

Préambule

Logo du framework Symfony

Symfony est un framework PHP basé sur le pattern MVC (Model, View, Controller) créé par la société française SensioLabs, dont la première version est sortie en 2005. À l’origine, ce framework avait été créé afin de ne plus avoir à développer des fonctionnalités récurrentes dans tous les projets internes (comme la gestion d’utilisateurs par exemple…), avant d’être partagé à tous les développeurs et que tout le monde puisse en profiter.

Par défaut, Symfony utilise quelques logiciels et librairies :

  • Twig comme moteur de template. Écrit en PHP, il a également créé par la société SensioLabs et est inspiré de Jinja, un moteur de template Python ;
  • Doctrine comme couche d’abstraction à la base de données. C’est un ORM (Object-Relational Mapping) pour le langage PHP inspiré de l’ORM Hibernate de Java. Celui-ci reste optionnel, mais disponible par défaut dans un projet Symfony ;

Depuis quelques années, Symfony est même utilisé comme base par de nombreux projets de grande envergure comme Drupal 8, phpBB, Joomla!, Laravel et d’autres…


Évolution du framework

Symfony 1

À l’origine, la première version du framework était appelée Sensio Framework, puis a été renommé “Symfony 1”. 
Ce nom a été choisi simplement parce que son créateur voulait conserver les lettres des initiales de Sensio Framework, SF (SymFony). 
La branche 1.x de Symfony a été ouverte en 2005, et sa dernière version en 1.x a été la 1.4.x. C’est en Novembre 2009 que Symfony 1 voit sa dernière version sortir, pour une LTS (Long-Term Support) allant jusqu’en Novembre 2012.
C’est donc à partir de cette date qu’il est désormais vivement conseillé de se diriger vers Symfony 2 pour tout nouveau projet.

Pour les plus curieux, voici un lien vers le GitHub de Symfony 1.

Symfony 2

En Juin 2011, Fabien Potencier (le CEO de SensioLabs) annonce la première release de Symfony 2 grâce à une communauté qui s’agrandit déjà très vite (250 contributeurs, contre 150 pour la version 1). De plus, de nombreux bundles commencent à sortir en masse (440 bundles, contre 170 pour la version 1), et la notoriété du framework explose. 
La version 2 n’est supportée qu’à partir de la version 5.3.2 de PHP.

De nombreuses nouveautés et changements apparaissent dans cette nouvelle version du framework.

Bundle : Une des majeures nouveautés est le principe de Bundle, qui remplace celui de Plugin. La différence entre ces deux fonctionnements est que, dans un plugin, tout est présent (configuration, modules, librairies PHP, etc…), un plugin peut donc rapidement devenir très conséquent. 
En revanche, le bundle se concentre sur une seule feature. Cela permet d’avoir un meilleur découpage de notre application, et le partage des bundles entre plusieurs projets, ou même au reste de la communauté sur le site de Packagist.

Autoloading : Une seconde modification majeure est le système d’Autoloading. Celui-ci était déjà présent dans la version 1 de Symfony, mais a été nettement améliorée dans sa seconde version.
En effet, dans Symfony 1 l’autoloading était géré dans un énorme tableau qui récupérait toutes les classes PHP repérées dans le projet dans sa totalité. En environnement de production, cela pouvait devenir très pénalisant puisque lors de l’ajout ou de la suppression de chaque nouvelle classe, il fallait vider les caches pour que cela soit effectif. 
Dans Symfony 2, c’est l’outil Composer (un outil de gestion de dépendances pour PHP) qui gère ce processus. Pour cela, un peu de rigueur est demandée, puisqu’il suffit de faire correspondre le nom de la classe PHP (y compris son namespace) avec le nom du fichier. Si cela est respecté, Composer pourra gérer automatiquement l’autoloading, à condition que le dossier soit précisé dans le composer.json. Vous pouvez y ajouter vos propres dossiers si vous souhaitez, dans la balise "autoload", comme suit :

{
"autoload": {
"psr-4": { "": "src/" }
}
}

En faisant cela, Composer va par défaut chercher dans le dossier vendor/, puis s’il ne trouve rien, il cherchera dans src/
PSR-4 est conseillé plutôt que PSR-0 pour sa facilité d’utilisation puisqu’il n’y a pas besoin de régénérer l’autoloader lors d’ajout de classes.

Une liste exhaustive des différences entre Symfony 2 et sa version majeure précédente est disponible en suivant ce lien.

Symfony 3

La version 3.0.0 de Symfony est sortie en Novembre 2015. Cette version majeure est très spéciale puisqu’elle n’apporte pas beaucoup de grosses nouveautés par rapport à la dernière version de Symfony 2.8. 
Le but principal de Symfony 3 a été de supprimer certaines fonctions dépréciées dans la version 2.8 du framework. 
Il y a tout de même quelques nouveautés notables comme un MicroKernel permettant de créer son propre micro-framework basé sur Symfony 3, ou encore de nouvelles features de DependencyInjection, entre autres.

Certaines de ces nouvelles features sont trouvables sur cet article officiel.

Symfony 4

Penchons-nous désormais sur la version 4 de Symfony sortie en Novembre 2017, qui nous intéresse le plus.
Cette nouvelle version majeure apporte son lot de nouveautés toutes aussi intéressantes les unes que les autres dont voici quelques exemples :

Symfony Flex 
Dans cette version, le Symfony Installer et le Symfony Standard Edition donnent place au plugin Composer Symfony Flex pour l’installation et la gestion d’une application Symfony. Celui-ci n’est pas obligatoire mais tout de même recommandé. Une page explicative est disponible sur le site officiel du framework.

Légèreté 
Une nouvelle application Symfony 4 est environ 70% plus légère qu’une nouvelle application faite avec Symfony 3. La volonté était de se focaliser vraiment sur l’essentiel et sur les fonctionnalités nécessaires pour toute application, afin de n’avoir que le strict nécessaire. Chaque fonctionnalité supplémentaire est toujours disponible, il suffira d’ajouter les bundles concernés grâce à Composer.


Commandes de base et packages utiles

Ces commandes sont basées sur une application utilisant Symfony Flex sur un projet Symfony 4. Certaines d’entre elles sont donc susceptibles de ne pas fonctionner pour une version antérieure.

Initialisation d’un nouveau projet
Depuis la version 4 du framework, plusieurs skeletons peuvent être utilisés lors de la création du projet. En effet, vous pouvez utiliser une version “website” si vous souhaitez un construire un projet complet en Symfony, ou une version plus allégée si la partie Symfony ne servira que pour servir une API REST ou un GraphQL, par exemple :

// Initialisation d'un projet “website”
composer create-project symfony/website-skeleton my-project
// Initialisation d’un projet minimaliste
composer create-project symfony/skeleton my-project
// En précisant une version spécifique de Symfony 
composer create-project symfony/skeleton:4.1.* my-project

Web Server Bundle
Lorsque vous êtes en développement, vous aurez sûrement besoin de pouvoir tester votre application sur un serveur web, sans avoir le temps ou l’envie de configurer un serveur web Apache ou Nginx. 
Pour faire ça le plus simplement qui soit, un Bundle existe et permet de lancer/arrêter un serveur web grâce à de simples commandes :

// Installation du package web-server-bundle (uniquement utile en dev)
composer require symfony/web-server-bundle --dev
// Lancement du serveur
php bin/console server:start
// Arrêt du serveur
php bin/console server:stop

Il faut bien évidemment comprendre que cela doit être utilisé dans le simple cadre du développement et ne doit pas être utilisé sur un réseau public.

Ajout de la toolbar (profiler)

Capture d’écran d’une installation neuve d’un Symfony 4 (skeleton) avec la toolbar en bas de l’écran

En Symfony 4, contrairement aux précédentes versions, la toolbar de debug n’est pas présente de base lors de l’initialisation d’un projet. Afin de l’intégrer, il suffit de télécharger le package correspondant :

// Installation du package profiler-pack (uniquement utile en dev)
composer require symfony/profiler-pack --dev

Framework Extra Bundle
Le Bundle de base du framework confère une base très simple mais stable et robuste d’un framework MVC. Celui-ci peut tout de même être étendu et amélioré, notamment par l’utilisation des annotations dans les contrôleurs. Cela se fait grâce au SensioFrameworkExtraBundle (présent de base dans les projets Symfony 3 et -) :

// Installation du package framework-extra-bundle
composer require sensio/framework-extra-bundle

MakerBundle :
Le MakerBundle de Symfony vise à aider à la création de fichiers, que ce soit Controller, fichier de test, validator, ou autre, de façon très intuitive. De ce fait, le développeur n’a plus à se soucier de la structure de base de ce type de fichier, ce qui permet un gain de temps conséquent. 
Quelques commandes de base :

// Installation du package maker-bundle (uniquement utile en dev)
composer require symfony/maker-bundle --dev
// Liste des commandes disponibles grâce à ce package
php bin/console list make
Résultat de la commande “php bin/console list make”

Doctrine
L’ORM (Object-Relational Mapping) est disponible de base dans un projet Symfony, mais optionnel. Un ORM permet d’avoir une couche d’abstraction avec la base de données et de modéliser les tables et les objets grâce à des entités (en PHP ici). En revanche, dans un projet Symfony 4, il faut tout de même installer le package :

// Installation du package 
composer require symfony/orm-pack

Une fois la configuration de la base de données faite dans le fichier .env, des commandes permettent de créer la base, entre autres :

// Création de la base de données
php bin/console doctrine:database:create

Couplé avec le Maker Bundle de Symfony, énormément d’opérations liées à la base de données peuvent se faire avec beaucoup de simplicité en lignes de commandes.

// Exemple de création d'une entité
php bin/console make:entity

Une fois la commande de création d’une entité lancée, un fonctionnement très intuitif se met en place pour la création des champs de l’entité (capture d’écran ci-dessous).

Création d’une entité Article comportant un title et un content, avec la commande “php bin/console make:entity”

On ne détaillera pas tout dans cet article, mais un guide complet est disponible ici.

De plus, si vous avez besoin de données de tests pour vos entités, il existe un bundle lié à Doctrine, qui s’appelle DoctrineDataFixtures. Il s’installe comme tous les autres packages, de la manière suivante :

// Installation du package (uniquement utile en dev)
composer require doctrine/doctrine-fixtures-bundle --dev

Pour la suite, un guide existe sur le site de Symfony.

Symfony / Security-bundle
La sécurité est un point très important pour les équipes de développement de Symfony. C’est pourquoi ils ont sorti leur propre bundle de sécurité. Celui-ci permettra de gérer efficacement et de façon très sécurisée le système d’utilisateurs avec l’encodage des passwords, la gestion de l’authentification et des firewalls, et d’autres encore… 
Ce bundle vous aidera énormément dans la sécurisation de votre application. Pour aller jusqu’au bout des choses, Symfony a même créé un guide complet sur leur site.

J’ai donné ici les quelques bundles que je juge personnellement indispensables lors de la création de nouveaux projets Symfony. Sachez qu’il y en a un tas d’autres de disponibles ! Si vous avez à développer une feature que l’on voit sur beaucoup de sites, vérifiez qu’un bundle n’existe pas déjà. Ce sera d’ailleurs très probablement le cas…


La suite ?

Depuis sa version 3, le framework conserve une roadmap très bien ficelée. En effet, une version majeure sort tous les 2 ans au mois de Novembre avec son support de bugs qui dure 8 mois et un support de sécurité qui lui, dure 14 mois. Au-delà de ça, une version mineure sort tous les 6 mois.

Pour en savoir davantage, un guide précis est disponible sur le site officiel.


Conclusion

Symfony est un framework PHP français basé sur l’architecture MVC qui est très utilisé en France, mais aussi dans le monde depuis plusieurs années maintenant. 
Ce framework est un moyen efficace de gagner du temps sur le développement de tout type de projet, que ce soit un site web complet, ou une application PHP plus simple. Dans tous les cas de figure, le framework saura s’adapter à vos besoins.
Grâce à sa communauté grandissante et très active, de nombreux bundles sont disponibles sur Packagist. Donc lorsque vous avez un développement récurrent à effectuer sur vos projets, vérifiez qu’un bundle n’existe pas déjà, il vous fera gagner énormément de temps !

Si vous êtes intéressé sur les nouveautés, ou toute autre chose à savoir sur Symfony, vous pouvez suivre Fabien Potencier, le lead project de Symfony chez SensioLabs sur Medium.