Symfony
SYMFONY, UN OUTIL PHP
POUR GAGNER DU TEMPS...
I : Introduction
1 : Présentation du Framework
2 : Qu'est ce qu'un modèle MVC
3 : Avantages principaux de Symfony (+ utilisations principales)
4 : Mise en place du Framework (Linux + Eclipse)
II Utilisation de Symfony
1 : Architecture du Framework (conventions, principes et structures à connaitre)
2 : Réécriture d’URL
3 : Création d’un Bundle
4 :
M
odèle : Virtualisation de la base de données
5 : Vue : Génération d'une vue
6 : Contrôleur : / Création d'un Contrôleur
III : Autres
1 : Sécurité
2 : Communauté
3 : Principaux concurrents
I
Symfony 2.0 webframework php 5.3.2 ou> ORM doctrine 2.1 php5-sqlite Intl apc
MySQL
1. Présentation du Framework
Depuis ces 10 dernières années le monde du web explose.
De plus en plus d'entreprises utilisent internet pour leurs applications ainsi que pour communiquer et partager des informations.
Depuis sa création, le langage PHP (PHP: HypertextPreprocessor) a grandement contribué à l'accessibilité de la création de sites internet.
Parmi tous les modèles de développement nous retiendrons les la structure MVC (Model Vue Contrôleur) qui permet d'allier rapidité, efficacité et productivité.
Ainsi, comment pourrions-nous intégrer le Framework MVC Symfony dans le cadre d'une application web afin de d'améliorer son développement?
Informations Générales :
Channel IRC : #symfony-fr
Forum : http://forum.symfony-project.org/ (anglais) Site Officiel : http://symfony.com
3. Qu'est ce qu'un modèle MVC ?
Une architecture MVC est constituée de trois principaux composants :
- Un contrôleur qui analysera la demande de l'utilisateur et qui récupérera dans le Modèle (source de données) les informations demandées.
- Un modèle qui représente les sources de données (stockage des informations).
- Une vue qui se charge de mettre en forme les informations qu'elle reçoit du contrôleur. Cheminement des données:
- Un utilisateur se connecte sur une page
- Il émet une requête afin d'obtenir l'affichage de la page.
- Le server reçoit le message le transmet au contrôleur suivant une route spécifique. - La route elle, va par rapport à la page demandée, appeler un contrôleur et son action. - Le contrôleur traite alors l'action et une fois terminée il répond à l'utilisateur avec la page
demandée. Exemple de situation:
1 Un utilisateur A se connecte à :
http://monsite.com/index.php
2 Le server reçoit une requête provenant de A pour la page index.php 3 La route appel le contrôleur et son action
4 Le contrôleur traite l'action
4.1 : Avantages principaux de Symfony
Symfony est parmi les meilleures bases de développement. En effet c'est un Framework MVC qui facilite considérablement le développement asynchrone.
Inspiré de RoR (Ruby on Rails), son code est tout aussi compréhensible ainsi que sa zone d’administration de type CRUD (Create Read Update Delete) est également très complète.
Il possède :
- Une gestion des routes très puissante - Un ORM intégré (Doctrine)
- Une gestion complète des formulaires (protection CSRF par exemple, génération automatique de code etc … ).
La communauté :
La communauté est très active. De plus les auteurs n'hésite pas à mettre des astuces ou des outils pour faciliter le développement de certaine fonctionnalité (des milliers de plug-in disponible). La documentation :
La documentation n'est pas négligée. Bien au contraire, elle est trés détaillé complète et dispose de nombreux exemples. Il reste flexible, en effet plusieurs ORM sont proposé (Doctrine, Propel sont les plus évolué), il en est de même pour le JavaScript (Prototype, JQuery, Mootools.
Support de nombreux Utilitaires :
Enfin il support de nombreux utilitaires tel que APC, eAccelerator pour accélérer l'exécution de code. La partie test :
N'oublions pas la partie test car Symfony intègre automatiquement une gestion des tests pour chaque Bundle/Contrôleur.
4.2 : Mais …
Bien que Symfony soit très puissant, et bien fait il n’en est pas pour autant le meilleur. Avant de se lancer dans un projet il faut en définir les aspects et c’est cette étape qui détermine qui détermine si votre Framework doit implanter ou non telle ou telle fonctionnalité.
Il en résulte donc obligatoirement des inconvénients connus et nécessaires venant de sont environnement général, le web.
Le Framework Symfony est très lourd non en regard de son poids - une quarantaine de méga-octets - De plus il est nécessaire d'avoir de bonnes bases de programmation avancés afin de d'optimiser le temps de développement qui reste crucial lors de d'un projet.
5.1 Installation Apache2 / PHP5
Installation pour Ubuntu Version 10.04 LTS lors d’une installation neuve. Les paramètres modifiés précédemment par vous ne seront évidemment pris en compte.
#Installer Apache2 et PHP5
sudo apt-get install apache2 sudo apt-get install php5
sudo apt-get install libapache2-mod-php5 sudo /etc/init.d/apache2 restart
#Installer MySQL Server / Client
sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install php5-mysql # Installation de tous les packages nécessaires:
sudo apt-get install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache mhash ming ps pspell recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json #Installation OpenJDK 6 - JAVA
5.2 Installation Eclipse Indigo 3.7.1
Téléchargez Eclipse “Classic” 3.7.1
http://www.eclipse.org/downloads/?osType=linux
# L’extraire
tar xzf eclipse-SDK-3.7.1-linux-gtk.tar.gz # Déplacez le dans le dossier /opt/ folder
sudo mv eclipse /opt
cd /opt
sudo chown -R root:root eclipse sudo chmod -R +r eclipse # Créez un executable eclipse dans votre dossier
sudo touch /usr/bin/eclipse sudo chmod 755 /usr/bin/eclipse sudo nano /usr/bin/eclipse
#Copier le code suivant dans le fichier ouvert par Nano (Commande précédente):
# Créer un raccourcis de menu Gnome
sudo gedit /usr/share/applications/eclipse.desktop Copier ce code dans la fenêtre Gedit qui vient de s’ouvrir :
# Launch Eclipse for the first time
/opt/eclipse/eclipse -clean &
5.3 Installation Symfony (+GIT)
Lors de cette installation, vous aurez à redémarrer plusieurs fois le service apache, lorsqu’il vous le sera indiqué, il faudra donc entrer dans la ligne de commande la ligne suivante :
sudo /etc/init.d/apache2 restart #GIT est nécessaire pour pouvoir télécharger les “VENDORS”
sudo apt-get install git-core cd /var/www
sudo wget http://symfony.com/download?v=Symfony_Standard_ Vendors_2.0.8.tgz -O symfony.tgz
sudo tar zxvf symfony.tgz cd Symfony
php bin/vendors install --reinstall #Ouvrez votre Navigateur Web et allez à l’adresse suivante :
http://localhost/Symfony/web/config.php
Voici comment résoudre les erreurs indiquées : **SQLite3 Missing
sudo apt-get install sqlite3
sudo apt-get install php5-dev libpcre3-dev sudo /etc/init.d/apache2 restart
** File permission
rm –rf app/cache/* rm –rf app/logs/*
sudo chmod -R 777 app/cache/ sudo chmod -R 777 app/logs/ sudo /etc/init.d/apache2 restart
** date.timezone
Il faut changer la propriété date.timezone dans le fichier php.ini (d’apache) sudo vi /etc/php5/apache2/php.ini
*Chercher le terme date.timezone( /timezone to search in vi)
*Décommentez la ligne et attribuez lui la valeur suivante : Europe/Paris *Enregistrez et quittez
Recommendations : ** PHP accelerator
sudo pecl install apc *configure it by default hit enter for each request *si phpize Error:
sudo apt-get install php5-dev libpcre3-dev sudo pecl install apc
*You should add "extension=apc.so" to php.ini
sudo vi /etc/php5/apache2/php.ini *Recherchez les emplacements des extensions dynamiques :
Sauvez, Quittez en redémarrez Apache **Install and enable the intl extension
sudo apt-get install libicu42 sudo apt-get install libicu-dev sudo apt-get install g++
*Set short_open_tag to off in /etc/php5/cli/php.ini*.
sudo vi /etc/php5/apache2/php.ini Modifier la ligne short_open_tag = On en short_open_tag = Off
5.4 Configuration de Symfony (SQL)
Après avoir créer votre base de donnée, ainsi que ses utilisateurs et privilèges :
Rendez-vous sur la page : http://localhost/ProgWeb_Projet_Symfony/web/app_dev.php
Cliquer sur configuration et rentrer les informations suivantes : - Driver : MySQL(PDO)
- Host : Localhost - Name : Symfony - Port : 3306
- User : (utilisateur de la Database créée précédemment) - Password : (Password de la Database créée précédemment) - PasswordAgain
5.5 Configuration de Symfony (CSRF)
La page suivante propose de configurer le Global Secret par exemple :
caf7c209106a8d2e16dacec7f7c4c72a4
CSRF - Prononcé « Sea Surf » - est une vulnérabilité très répendue et connue dans le monde des sites internet. En effet, le Cross-Site Request Forgery consiste en l’exécution d’un script malveillant de façon transparente et inconsciente pour celui qui l’exécute.
il suffit d’envoyer ce script (par des moyens illégaux comme le fait de cacher le script dans une image par exemple (Sténographie)) à une personne disposant des droits d’utilisateurs suffisant pour faire l’action choisie, puis de le faire exécuter par cette personne ou évidemment de récupérer les identifiants de cette personne lors de sa connexion.
Sans qu’elle se sache, elle aura par exemple changé la page d’un site internet, supprimé un article, modifié des droits ou permit à la personne malveillante de se connecter.
La clé CSRF est donc un moyen préventif, mais nécessite tout de même le respect de notions importantes en sécurité web :
- Utiliser la méthode POST pour tous les formulaires
- Demander des confirmations aux utilisateurs pour toutes les actions critiques - S’assurer que son site n’est pas vulnérable au XSS
- Demander les anciennes informations lors de la modification de celles-ci (email/mot de passe)
- Utiliser la clé CSRF pour chacun des formulaires
Concrètement, pour chaque formulaire, un jeton de validité est créé en fonction de la clé CSRF originale (voir suite), puis placée dans le formulaire en tant que valeur ainsi que dans une variable de session.
Il suffit ensuite à la réception des valeurs de formulaire de vérifier qu’elle existe et de comparer la clé récupérée dans la variable de session ainsi que celle récupérée par POST. Ce qui donne :
Créons donc tout de suite notre clé CSRF
Finalement, à la dernière page si votre utilisateur de session actuelle linux n’a pas les droits suffisant, il se peut que vous vous retrouviez avec une page d’erreur vous indiquant que Symfony ne peut pas modifier le fichier lui-même.
Dans ce cas faites le vous-même :
/var/www/ProgWeb_Projet_Symfony/app/config/parameters.ini Collez votre Global Secret dans le fichier de configuration à l’endroit indiqué
II
Utilisation de
Symfony
1 : Architecture du Framework
L'architecture de symfony est plutôt flexible. Nous parlerons de la version standard (Standard Edition) qui comporte par default la structure recommandée pour une application Symfony:
1 app/: Configuration de l'application
2 src/: Emplacement du code PHP de l'application 3 vendor/: Plugin tiers
4 web/: Dossier racine web
5 Authentification / Autorisation : Sécurité et gestion des utilisateurs 1 Le dossier « app/ »
Il contient le noyau de l'application et toute sa configuration. 2 Le dossier « src/ »
Il contient tous les bundles propres à l'application. Un bundle et généralement associé et définit comme une fonctionnalité de l'application. Mais il contient aussi des librairies, « Helpers » (outils d’aide au développement), ou autres outils pour nos contrôleurs.
3 Le dossier « vendor/ »
Ce dossier contiendra tout les plugins tiers que l'on souhaite ajouter à notre application (par exemple : Forum, blog clés en mains).
4 Le dossier « web/ »
Le dossier web contient tous les éléments public de notre application comme les images, feuilles de styles(CSS), ou des script (JavaScript).
2 : Réécriture d’URL
Dans un Framework MVC la redirection des routes est omniprésente, ce seront-elles qui définiront quelle action d'un contrôleur sera exécuté lors d'une requête.
La personnalisation des routes est ici la fonctionnalité la plus intéressante. En effet quoi de plus lourd que de renommer un lien qui pointe sur une ancienne page qui n'existe plus?
Il pourrait falloir rechercher le lien sur chaque page de l'application et le remplacer.
Vous aurez vite comprit que si l'application contient 4000 pages cela devient presque irréalisable... Dans symfony2 si on décide de refactoriser un lien il suffit d'ajouter une route personnalisée. Reprenons notre utilisateur Toto qui va sur monsite.fr/homepage, cependant on décide de renommer l’URI pour que cette page soit accessible depuis monsite.fr/index ou monsite.fr/accueil. Pour cela il suffira de rajouter une règle de route disant: "toute requête provenant de /index ou /accueil se redirigée vers le contrôleur 'homepageController'".
Il existe 3 façons de définir les routes: le YML, XML ou en PHP, nous nous attarderons sur le format par défaut – l’YML.
Exemple de redéfinitions de routes pour /accueil au niveau du contrôleur principale (Routing.yml):
De cette manière tout la définition des routes et centralisé clair et paramétrable à souhait. Exemple :
Un visiteur Toto se connecte sur monsite.fr/homepage, l'url sera donc monsite.fr (le domaine) suivit de /homepage (l'URN). Le routage de l'URI commence par la réception de l'URN par le contrôleur principal. Celui-ci va regarder s'il existe une définition personnalisée de cette URN dans sa table de route: si une définition existe alors il utilisera cette définition sinon celle par default qui consiste à prendre le premier paramètre de l'URN comme contrôleur et le second comme action le reste des URN étant des paramètres de l'action. Dans notre cas il n'existe que le nom du contrôleur. Symfony2 va donc prendre l'action par défaut de notre contrôleur 'homepageController' qui se trouve être 'indexAction'. si cette action par défaut n'existe pas une erreur 404 est affichée.
3 : Création d’un Bundle
Déclaration du nouveau BUNDLE
php app/console generate:bundle
--namespace=Blogger/BlogBundle --format=yml Tapez entrée par défaut pour toutes les questions
Nettoyage
Nettoyage car nous n’avons pas besoin de certains des fichiers par défaut créés par le générateurs
rm src/Blogger/BlogBundle/Controller/DefaultController.php rm -R src/Blogger/BlogBundle/Resources/views/Default/ rmsrc/Blogger/BlogBundle/Resources/config/routing.yml
Création et présentation du BUNDLE
vim src/Blogger/BlogBundle/Resources/views/layout.html.twig
Insérer le code suivant et enregistrer :
4 :
Modèle
->
Virtualisation de la BDD
Le modèle d'une application Symfony2 correspond aux sources de données sous forme de code objet. On appel cette retranscription le mappage, on a ainsi accès à une source de donnée en passant par un BAL (Database Abstraction Layer).
Symfony2 utilise Doctrine.
La première étape est la configuration d'un accès à une ressource comme une base de données MySQL (le plus commun):
sudo vim app/config/parameters.ini
Insérez-y le texte suivant
Le fait de séparer la configuration permet de disposer de plusieurs configurations (utilisation de base de données de test pour un serveur de développement et une seconde pour la production).
Astuce : Il est possible par la suite de créer automatiquement la base de données grâce à la console avec la commande suivante:
php app/console doctrine:database:create
La création d'entité
Notre application dispose d'utilisateurs. Pour utiliser l'application, cette dernière doit disposer des informations sur les utilisateurs (nom, login, mot de passe, droits) qui proviennent de la base de données. Il faut donc un objet représentant les utilisateurs provenant de la base de données.
Exemple d'objet de l'entité utilisateur:
Astuce : il est également possible de générer une entité à l'aide de la console: php app/console doctrine:generate:entity
entity="AcmeStoreBundle:Utilisateur" --fields="name:string(255) login:string(255) password:string(32)"
Mappage
Afin que Doctrine puisse savoir comment interagir avec la base de données il faut définir leurs caractéristiques grâce à des annotations:
Astuce : l'annotation de la base de données est optionnelle, si elle n'est pas spécifiée, la table prendra le nom de l'entité (attention aux mots réservé tel que Group et User).
De plus il existe dans doctrine, une multitude de définitions de champs (http://symfony.com/doc/2.0/book/doctrine.html#book-doctrine-field-types).
Maintenant que Doctrine sait comment interagir avec votre source de données on génère les accesseur et mutateur:
php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Utilisateur
Il est possible de générer le schéma SQL à partir de la console, ainsi vous assurez la compatibilité mappage ORM et Base de données:
php app/console doctrine:schema:update --force
Interactions avec la base de données
Modification et suppression dans la base de données depuis l’ORM :
Doctrine dispose également de son propre système de génération de requêtes :
Il existe aussi d’autres méthodes plus complexes que nous n’aborderons pas ici, car elles nécessitent un niveau de connaissances plus avancé que ce que nous avons vu dans ce tutoriel, à savoir les méthodes permettant d’exploiter les tables contenant des clés étrangères.
Vous pouvez cependant retrouvez tous les détails nécessaires à ces opérations dans la documentation Symfony2 disponible à cette adresse : http://symfony.com/doc/current/
Point sur le modèle :
L’exportation des sources de données vers du code objet permet d’optimiser le déploiement d’une application car la base de données est mappée en objet, ce qui permet de regrouper toutes les manipulations sur les données en un seul lieu, et ainsi améliorer la qualité, l’évolutivité, la compréhension du code.
De plus, l’ORM étant présent pour générer les requêtes, les erreurs de syntaxes deviennent quasi-inexistantes.
5 :
Vue
->
Génération d’une vue
Symfony2 intègre un nouveau système de template très puissant permettant de gérer ses vues grâce à un moteur, TWIG.
TWIG est un moteur de template PHP intégré à Symfony2 facilitant grandement le travail en équipe avec des intégrateurs (ils n’auront qu’à modifier les templates dans : views/ du bundle concerné) et très puissant permettant de :
-
Gérer l’héritage entre templates et layout-
Séparer les couches présentation / métier Nous remarquerons 3 principaux types de balises :-
{{ variable }} : Affiche le résultat ou contenu d’une valeur / fonction-
{% for page in arrPages %} : Permettant d’exécuter une fonction ou de définir un bloc-
{# Les commentaires #}Le véritable avantage (et incontestable) est donc l’héritage des templates, pouvant par exemple intégrer la balise {{ parent() }} ce qui aurait pour effet d’afficher le contenu du template parent. Mais passons à un exemple de code plus concret :
Après avoir complètement créé votre Bundle :
Allez tout d’abord consulter le layout de base de votre projet (seulement pour information):
app/Resources/views/base.html.twig
Une fois que vous en avez pris connaissance ouvrez le fichier Default/index.html.twig
et ajoutez-y les lignes suivantes :
Vous avez donc étendu votre page index.html.twig avec votre fichier base.html.twig et son contenu bien entendu.
Mais pas uniquement, vous avez également affiché un bloc « title » et un bloc « body »
Le bloc Title : le deuxième bloc récupère le contenu de son parent par héritage puis le concatène à son propre contenu. Ce qui donne : “Hello World Title” Le bloc Body : affiche simplement “Hello World Body” dans les balises body
En plus d’être simple et rapide d’utilisation, TWIG est un moteur de template vraiment très puissant, principalement via les possibilités d’héritage.
6 :
Contrôleur
->
Création d’un contrôleur
Disposition du contrôleur
vimsrc/Blogger/BlogBundle/Controller/AccueilController.php Insérer le code suivant et enregistrer :
mkdirsrc/Blogger/BlogBundle/Resources/views/Accueil/ vimsrc/Blogger/BlogBundle/Resources/views/Accueil/index.
html.twig
** Insérer le code suivant et enregistrer :
vim src/Blogger/BlogBundle/Resources/config/routing.yml ** Insérer le code suivant et enregistrer :
vim app/config/routing_dev.yml Mettez en commentaires (#) la première route entière
Création du Bundle terminée, rendez-vous ici pour voir le résultat :
III
Informations
1 : Sécurité
Authentification :
Ce qui gère l’authentification dans Symfony2 est le firewall (Voir schéma architecture du Framework) Les Firewalls :
Défini plusieurs zones de sécurités en étant lié à des Providers (Fichier de configuration, entité Doctrine2, autre source). Il se définit donc par un Pattern ainsi que des informations de connexion.
L’encoder :
Encode et Hash les mots de passes utilisateur Autorisation :
Ce qui gère l’autorisation dans Symfony2 est l’Acess Control. Rôles :
Règles d’autorisations appliquées à des utilisateurs permettant d’autoriser ou non l’accès à des pages en fonction de celui-ci (ROLE_ADMIN, ROLE_MODERATEUR …)
Access Control :
Vérifie et autorise ou refuse les utilisateurs en fonction de leurs droits. 3 manières différentes de sécurisation de connexions :
- Accès a une page de façon anonyme et sans droits particuliers
- Accès a une page de façon anonyme mais nécessitant tout de même des droits - Accès à une page de façon identifiée mais sans les droits suffisants
Protection contre les attaques de type :
- CSRF (voir Présentation du Framework -> 5.5 ) - XSS
- Injections SQL Le fichier security.yml :
Il est un fichier de configuration de la sécurité du Framework, il permet de configurer l’encodeur, la hiérarchie des rôles, les providers, les firewalls, ainsi que l’Access Control.
2 : Communauté
La communauté de symfony2 est une communauté fidèle car satisfaite de la première version de Symfony, mais également très fournie et vivante.
Par le biais de forums, chat, documentation ou support technique il est possible de discuter, apprendre et réaliser des travaux ou projets en étant assuré d’une aide précieuse.
Le support technique quand à lui propose correctifs et solution de façon régulière et réactive. Tous les éléments sont donc réunis pour garantir une bonne approche de ce Framework.
3 : Principaux concurrents
CakePHP
PHP 4 /5, MySQL, PosrtgreSQL, SQLite, AdoDB
Très proche de l’esprit Rail
Mojavi
PHP 4 /5, MySQL, PosrtgreSQL, DPO, Creole
Phocoa
PHP5, MySQL, Smarty, Phing
Venant du Framework Cocoa d’Apple Portage en PHP
Focumentation générée grâce à phpDoc mais complète.
PHP on Trax
PHP5, PEAR::DB
Documentation Succinte
Nécessite des extensions PEAR pour certaines fonctionnalités
Seaqull
PHP5, PEAR
Basé sur Mojavi / Propel / Rails
Ajout des fonctionnalités : Internationalisation automatique, gestion de tâches, pagination
WACT
PHP4&5, MySQL
Très porté sur la sécurité
Zend Framework
PHP5.0.4, PECL::PDO
Grande communauté
Incorpore de nombreux modules Documentation très complète
Conclusion
Bien que lourd en apprentissage et fonctionnalité, Symfony2 reste un des Framework les plus appréciés du moment de par son architecture, son modèle MVC, ses cotés « Rails », sa rapidité d’utilisation une fois bien maîtrisé.
Au cours de nos recherches, nous n’avons tout simplement pas trouvé de site ou forum rabaissant ce Framework et ça se comprend.
Le gain de temps, la simplicité, l’évolutivité, la communauté, la sécurité, le support, la
documentation, la facilité d’intégration / installation, la possibilité d’utilisation dans Eclipse et NetBeans sont autant de raisons retrouvées sur toutes les pages de tutoriels, d’exercices, de définitions ou forums faisant sans cesse pencher la balance en la faveur de Symfony.. Après une première utilisation de ce Framework, il est apparut évident qu’il s’imposera naturellement dans la réalisation des projets web futurs d’une certaine taille ou complexité minimum.
Symfony est donc à conseiller à tous ceux :
- Qui ont le temps de s’investir dans un apprentissage assez poussé d’un Framework, - Qui souhaiteraient réaliser un projet sur le long terme
- Qui disposent d’une ou plusieurs équipes de développement - Qui ont des besoins de mises à jour régulières (CRUD)
Nous pouvons d’ailleurs constater la récente évolution du site internet DailyMotion vers le
framework Symfony2, ce qui une fois de plus, renforce la notoriété de ce dernier dans le monde du développement PHP.