Académique Documents
Professionnel Documents
Culture Documents
http://symfony.com/
I : Introduction
1 : Présentation du Framework
II Utilisation de Symfony
1 : Architecture du Framework (conventions, principes et structures à connaitre)
2 : Réécriture d’URL
III : Autres
1 : Sécurité
2 : Communauté
3 : Principaux concurrents
Conclusion
I
Introduction
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 :
Pré-Requis
Intl apc
MySQL
3. Qu'est ce qu'un modèle MVC ?
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
5 Le server répond à l'utilisateur A en renvoyant le contenu de la page index.php.
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.
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.
# L’extraire
tar xzf eclipse-SDK-3.7.1-linux-gtk.tar.gz
cd /opt
#Copier le code suivant dans le fichier ouvert par Nano (Commande précédente):
# Default Repertory : /var/www# When is Started, quit and lauch again with normal executable
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 :
**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
** PHP accelerator
sudo pecl install apc
*configure it by default hit enter for each request
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.
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).
5 Authentification / Autorisation :
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.
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.
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 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.
3 : Création d’un Bundle
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
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
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 : 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).
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
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/
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
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 :
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
mkdirsrc/Blogger/BlogBundle/Resources/views/Accueil/
vimsrc/Blogger/BlogBundle/Resources/views/Accueil/index.
html.twig
vim src/Blogger/BlogBundle/Resources/config/routing.yml
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 :
http://symblog.dev/app_dev.php/.
III
Informations
Complémentaires
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.
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.
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.
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.