Veille technologique Symfony 2 Introduction : Symfony2 est un Framework PHP en MVC qui a pour objectif d'accélérer les développements. Il impose également un certain nombre de bonne pratique à respecter afin d'harmoniser la structure de vos projets en équipe, en facilitant donc l'implémentation de fonctionnalité ou la maintenance du site. Pourquoi utiliser symfony2? Symfony2 comporte un certain nombre de librairies de base qui permette une simplification du code à l'aide de couches d'abstractions entre les différents éléments de votre application. Peu importe le type de base de donnée sur lequel vous voulez implémenter votre application, Symfony2 utilise Doctrine, un ORM et PDO qui possède les drivers des bases de données actuelles du marché. Symfony gère aussi automatiquement la mise en cache, la gestion de formulaire avec validation CSRF, les utilisateurs et leurs sécurités et permissions, le debug avec un profiler et un debugger très puissant, les internationalisations de site, les moteurs de Template. Enfin un bon nombre d'outils qu'il serait long de développer mais que symfony2 met à notre disposition de manière transparente. Et enfin la communauté Symfony développe et partage en open source un certain nombre de module/plugin/bundle que vous pourrez utiliser (et même contribuer si vous le souhaitez) aisément sans avoir à recoder la fonctionnalité, notamment FOS User Bundle qui permet la gestion de tous les utilisateurs seulement à l'aide de ce bundle (création de compte/ connexion sécurisé / activation de compte / réinitialisation de mot de passe et bien d'autre fonctionnalité très utile). Installation de Symfony2? Pour installer Symfony2, vous devez avoir un environnement de développement fonctionnel. Vous devez aussi configurer la variable d'environnement PATH si vous êtes sous Windows. Ensuite vous devez télécharger le fichier installeur grâce à la ligne de commande suivante : Enfin vous devez créer votre projet à l'aide de la ligne de commande suivante : Projet Symfony3 : php symfony new my_project Projet Symfony2 : php symfony new my_project 2.8 (LTS jusqu'en Nov 2018) Vous aurez alors votre projet Symfony prêt à être exploité!
Architecture de Symfony2 : Comme expliqué dans l'introduction, Symfony impose un certain nombre de bonne pratique. Premier dossier du framework, le dossier app : Ici sera stockée toute la configuration de notre projet. On peut voir un dossier configuration qui permet de définir différente variable globale que nous allons utiliser dans notre application. Vous pouvez créer vos propres fichiers de configuration yml et utiliser les fichiers existants pour configurer votre sécurité ou votre base de données... Aussi un dossier ressource est disponible, il permet de stocker des données que l'on voudra réutiliser dans notre application, comme des layouts de base (header/footer?) ou encore des modules de navigation. Enfin diffèrent fichier sont disponible à la racine du dossier app, notamment le plus important, AppKernel.php, qui permet le chargement de notre configuration et de nos bundles au lancement de l'application. Ce dossier est commun à tous les bundles et sert à faire les liens entre eux pour former une seule application. Il nous arrivera d'écrire et de configurer notre application ici mais seulement ce qui est nécessaire à l'ensemble de l'application, sinon il est plus pertinent de coder dans vos bundles directement. Deuxième dossier du framework, le dossier vendor : Les vendors sont des librairies externes à votre projet qui mette donc à disposition un ensemble de fonction, de classe regroupé. L'avantage d'utiliser un tel système est la possibilité de mettre en jour les dépendances à l'aide de Composer. La configuration des librairies nécessaires ce trouve dans le fichier composer.json. Troisième dossier du framework, le dossier web : Ce répertoire est la partie publique de votre site web Il contient des ressources publiques telle que des fichiers js, css, images. Les ressources essentielles au fonctionnement des bundles sont dans le répertoire bundle et sont généré de façons automatiques. Enfin les fichiers app.php et app_dev.php sont les points d'entrée de l'application. C'est vers eux que le serveur nous redirige pour traiter toutes les requêtes et envoyer la réponse au client. Quatrième dossier du framework, le dossier src : C'est ici que l'on codera notre application découpée en plusieurs bundles, avec notre logique métier et des "plugins" pour le fonctionnement du site (forum, blog, espace utilisateur, et bien d'autres modules). Voilà l'essentiel de l'architecture de base de Symfony2. Nous verrons prochainement l'architecture des bundles et les règles de nommage.
Le fonctionnement fondamental de Symfony2 : Pour mieux comprendre le fonctionnement du bundle, il est intéressant d'avoir quelques notions sur le fonctionnement de Symfony2. Symfony2 fonctionne à l'aide d'un fichier PHP qui reçoit toutes les requêtes du serveur et qui les traites à l'aide des standards de la http Fundation. A l'aide de ces librairies, Symfony2 abstrait un grand nombre de choses et fourni des méthodes pour exploiter les requêtes de l'utilisateur, notamment l'url demandée et les paramètres passés. Notre premier Bundle : C'est au travers de ce chapitre que nous verrons les principales fonctions que l'on doit coder dans un bundle, comment s'organise le code dans notre arborescence, les règles de nommage et les fichiers nécessaires. Il faut garder à l'esprit qu'un bundle est autonome, et qu'il a une configuration pour fonctionner avec d'autres bundles. Un bundle contient au minimum des contrôleurs, des routes, des vues, et des informations de configuration. Mais il peut contenir bien plus, comme des entités, des repositories, des forms, des ressources publiques, des fixtures Dans cet exemple, ce bundle sert à afficher des pages web simples dans un Template de votre choix, le tout sur votre base de données. Grâce à l'arborescence et les règles de nommages Symfony2, vous pouvez comprendre quels fichiers servent à quelle fonction. Nous nous intéresserons au contenu de ces fichiers dans un second temps.
Le point de départ est le fichier routing.yml qui sera chargé dans notre fichier routing.yml dans le dossier app/config et l'instanciation du Bundle dans le app/appkernel.php. Il contient les routes auquel le bundle page peut répondre par une action d'un contrôleur. Comme on peut le voir, toutes ces routes ont un nom "page" un chemin "/page/" et un paramètre "{id}". On y fait correspondre un contrôleur avec la synthaxe NomBundle:NomControlleur:NomAction. Dans cet exemple on utilisera la fonction pageaction() qui demande un id en paramètre, qui est contenu dans le contrôleur PageController.php dans le bundle PageBundle. Et c'est tout! Voilà comment gérer une requête utilisateur. Ensuite il faudra voir plus en détail le contenu de la méthode pour comprendre le fonctionnement du site, mais c'est la méthode pageaction($id) contenu dans le contrôleur PageController.php du PageBundle qui recevra tous les objet requête lorsque l'utilisateur enverra une requête vers /page/id. Cette méthode ira donc rechercher la page dans une base de donnée par exemple et renverra une vue de la page (Render). On pourrait aussi choisir de rediriger l'utilisateur vers une route (RedirectResponse) ou une action d'un autre contrôleur (forwarding) s'il n'a pas besoin de généré du HTML.
La surcharge de Bundle : Sous symfony, les bundles sont exportables et la communauté de symfony partage des bundles en open-source. C'est le cas de FOS User Bundle par exemple, qui est très célèbre et qui permet une gestion des utilisateurs, des profils, de l'activation de compte, changement/oublie de mot de passe, et beaucoup d'autre fonctionnalité. Il existe plusieurs manière d'installer un bundle externe, vous pouvez utiliser composer, ou installer de manière manuelle. Pour la méthode manuelle, cela consiste à télécharger le Vendor que l'on placera dans le dossier correspondant, puis charger la librairie dans l'auto-load et dans le kernel, et importer la route du bundle dans le fichier route principal (en le préfixant si besoin). Prenons un exemple pour illustrer la surcharge : Voici les lignes à ajouter a symfony pour charger le bundle que vous avez placez dans le dossier vendor au préalable. Autoload.php : AppKernel.php : Routing.yml : Ensuite, vous créer votre bundle qui va surcharger le bundle que vous venez d'installer, et dans l'entité Utilisateur vous allez l'extend à la classe abstraite du bundle. Et voilà, le tour est joué! Il ne vous reste plus qu'à surcharger les vues dans le dossier correspondant au bundle, pour FOSUser ce sera app/ressources/fosuserbundle