Je vous propose aujourd'hui de voir les différences entre Laravel et Symfony en comparant comment les 2 frameworks approchent les tâches classique.
Sommaire de la vidéo
- 00:33 Installation
- 01:39 Structure de base
- 03:40 Onboarding
- 04:32 Les routes
- 07:55 Gérer la requête
- 09:55 Paramètre dans l'URL
- 11:25 Moteur de template
- 19:21 Gérer un formulaire
- 31:23 API : Gérer la requête
- 35:47 API : Serialisation
- 42:39 Base de données : ORM
- 01:04:05 ORM : Les relations
- 01:16:15 Authentification
- 01:25:22 Permissions
- 01:33:02 Tests
- 01:37:28 Service et Injection de dépendances
- 01:44:08 Conclusion
Installation
Dans les 2 cas l'installation peut se faire au travers de la commande create-project de composer.
Symfony nécessite plusieurs commande car il s'installe en mode "microservice" par défaut en n'incluant que le strict minimum. La commande composer require webapp permet d'installer tous les composants nécessaire à la création d'une application web classique.
On notera aussi que les 2 frameworks intègre une commande (laravel pour Laravel et symfony pour Symfony) que l'on peut utiliser pour piloter le framework et faire certaines tâches (initialiser un projet par exemple).
Structure
La structure des 2 frameworks est similaire avec la présence d'un dossier public qui servira de racine au serveur HTTP. Les sources sont placé dans un dossier src pour Symfony et app dans le cas de Laravel. Dans les 2 cas la configuration se situera dans le dossier config avec comme principale différence le format utilisé.
- Laravel utilise des fichiers des PHP qui retourne des tableaux
- Symfony utilise par défaut des fichier yaml
Les routes
Maintenant que les framework sont installés on va pouvoir créer notre première route pour créer une page. Dans le cas de Laravel on commence par créer le controller
Puis on déclare la route qui permet d'accéder à la méthode.
Côté Symfony il est possible de déclarer les routes au travers d'attribut dans le controller directement.
Gérer la requête
Pour les 2 frameworks il est possible d'injecter un paramètre dans nos controllers pour récupérer la requête.
On notera que l'objet Request présent dans Laravel étend de la class Request de Symfony pour proposer des méthodes plus rapides pour effectuer des opérations de bases.
Paramètre dans l'URL
En plus du traitement de la requête il est aussi possible de passer des paramètre dans l'url. La syntaxe et le fonctionnement est similaire dans les 2 frameworks
On pourra ensuite récupérer ce paramètre dans le controller sous forme de paramètre.
Moteur de template
Pour rendre des pages HTML il sera possible d'utiliser un moteur de template et c'est sur ce point qu'apparait une première différence entre les 2 frameworks.
Symfony utilise le moteur de template twig qui utilise sa propre syntaxe inspirée par Django. Il est possible d'étendre le moteur en ajoutant des fonctions, filtres, et balises
Laravel utilise un moteur de template propre au framework : blade. Ce moteur étend la syntaxe de PHP avec de nouvelles fonctionnalités mais accepte accepte aussi du code PHP valide. Il peut être étendu à l'aide de nouvelles directives pour lesquelles il faudra définir le code PHP à générer.
On notera que blade offre un système de composants qui permet d'inclure un morceau de template en utilisant une syntaxe plus proche de l'HTML.
Formulaire
Une des tâche récurrente lorsque l'on fait du backend est la création et le traitement de formulaire.
Symfony
Sur Symfony la création de formulaire passe par une classe dédiée qui va permettre de représenter les données de notre formulaire. On notera la possibilité d'ajouter des règle de validation sur les propriétés à l'aide d'attributs PHP.
Ensuite on peut créer la classe qui va représenter notre formulaire et ces champs.
Ensuite, dans le controller il est possible de gérer le traitement du formulaire, et de l'envoyer à Twig pour gérer l'affichage.
Côté template le formulaire peut être généré à l'aide de la fonction form qui est injecté dans Twig par Symfony.
Laravel
Sur Laravel il n'existe pas de classe pour représenter le formulaire, ni pour générer le formulaire. Dans notre template blade on créera donc notre formulaire de manière classique (on pourra utiliser des includes ou des composants pour simplifier l'écirute des champs).
Lorsque le formulaire est soumis, et que des erreurs sont présentes, Laravel redirigera automatiquement l'utilisateur vers le page précédente en sauvegardant les données et les erreurs en session.
- La méthode
old()permet de récupérer, depuis la session, la valeur de la précédente soumission du formulaire. - La directive
@errorpermet de détecter si il y avait une erreur, et d'afficher quelquechose si c'est le cas.
Maintenant pour la partie traitement, on va commencer par créer un objet requête personnalisé qui permettra d'autoriser la requête et de valider son contenu.
Ensuite, on va créer une route pour la méthode POST et on utilisera notre objet requête en paramètre de la méthode.
API
Un autre cas d'utilisation de ces frameworks est la création d'une API.
Parser la requête
Lorsque l'on reçoit un appel il faut être capable de comprendre le contenu de la requête et cela se fait très facilement pour les 2 frameworks. Côté Laravel on utilise le même système de FromRequest.
Symfony permet lui aussi de traiter la requête facilement à travers un attribut au niveau des controllers.
Réponse d'API
Pour répondre correctement à une demande il est nécessaire de sérialiser les données pour transformer un objet en réponse valide (JSON par exemple). Laravel dispose d'un type de classe, dédié à la transformation des objets.
Cette resource peut ensuite être utilisée pour renvoyer les données au niveau du controller.
Symfony utilise un système de serialisation pour transformer un objet et peut être utilisé sur n'importe quel objet. Dans le cas des controllers une méthode json permet de gérer la conversion d'une manière plus simple.
Le paramètre "groups" permet de contrôler les propriétés que l'on souhaite exposer au travers d'attributs.
L'ORM
L'ORM est aussi un gros point de différence entre les 2 frameworks.
Laravel utilise par défaut Eloquent qui est un ORM basé sur Active Record où le Model est à la fois responsable de représenter une entité, mais aussi de gérer la persistence des informations.
Symfony utilise par défaut Doctrine qui est un ORM basé sur le principe du Data Mapper où on sépare la notion d'entité (objet représentant les données), de Repository (objet servant à récupérer des entités) et de Manager (objet responsable de la persistance)
Eloquent a une syntaxe plus courte et une logique qui semble plus naturelle mais cette apparente simplicité peut rapidement mener à des "fat models" car toute la logique va être stocké au même endroit. Doctrine permet une meilleur séparation mais s'avèrera relativement verbeux pour des cas simples.
Authentification
Pour l'authentification Laravel propose des "starter kits" qui permettent de mettre en place toutes les opérations classique de gestion de compte utilisateur. Un de ces starters kits est breeze qui va générer les controllers, models et template blade.
Le code sera généré dans le domaine de votre application et vous pouvez le modifier pour ajouter le comportement que vous souhaitez en modifiant les sources.
Symfony, quant à lui, dispose d'un composant sécurité qui va permettre de gérer l'authentification mais n'est pas configuré de base.
L'éxécution de ces commandes vous permettra de configurer la mise en place de l'authentification. En revanche, ce qui est offert par défaut est beaucoup plus minimal et il vous faudra développer la partie rappel de mot de passe, édition et suppression de compte
Le même coeur : Le Service Container
Bien qu'ayant une approche différente au niveau des méthodes fournies, les 2 frameworks renferment le même système de Service container pour faire communiquer les différents composants ensemble. Si par exemple on veut générer une page :
Bien que très différentes, ces 2 méthodes éxécutent un code relativement similaire si on regarde ce qui se cache derrière :
Dans les 2 cas, le framework va commencer par créer un container qu'il va ensuite remplir de différents services qui pourront ensuite être récupérés suivant les besoins au sein de l'application. Laravel se différencie de Symfony par le fait qu'il rende le container accessible n'importe où dans l'application gràce à l'utilisation d'un Singleton, là ou Symfony imposera une plus grande rigueur en forçant l'utilisateur à spécifier les dépendances via un fichier services.yml.
Donc Symfony ou Laravel ? les 2 !
Laravel se focalise sur la simplicité du code pour le développeur (arriver à la solution simplement) ce qui passe par l'utilisation de méthode magique de PHP afin d'offrir un code basé sur des conventions.
Symfony impose plus de rigueur et est plus proche d'un code PHP classique (à l'exception de la configuration yaml) et est donc en général plus verbeux. Sa faible utilisation de méthodes magique permet une meilleur navigation dans le code et une analyse statique simplifiée.
Au final le choix va surtout dépendre de votre affinité vis à vis de la voix choisie par ces 2 frameworks pour résoudre la problématique de la création d'application Web.