Introduction
Le framework symfony est un projet Open-Source depuis plus de 3 ans. Il est devenu l'un des plus populaire framework PHP grâce à ses fonctionnalités et sa bonne documentation. Cette grande tradition à commencer dès le début.
En Décembre 2005, après la première version officielle de symfony, nous avons publié "le tutorial Askeet", une série de 24 tutoriels publiés jour par jour entre le 1er Décembre et Noël.
Ce tutoriel a prouvé qu'il était un formidable outil pour promouvoir le framework aux nouveaux développeurs. Beaucoup de développeurs ont appris symfony grâce à askeet, et beaucoup d'entreprises l'utilisent encore aujourd'hui comme principal support d'apprentissage.
Mais le tutoriel askeet a commencé à montrer son âge et avec la publication de symfony 1.2, nous avons décidé de publier un nouveau calendrier de l'avent, Jobeet.
Ce tutoriel a été publié au jour le jour sur le blog de symfony en 2008, et vous lisez son incarnation en livre.
Le défi
Chaque chapitre/jour est destiné à durer environ une heure, et sera l'occasion d'apprendre symfony en codant un vrai site web, du début à la fin.
24 fois une heure est égal à un jour, nous pensons que c'est le temps nécessaire à un développeur pour apprendre les bases de symfony. Chaque jour, nous ajouterons de nouvelles fonctionnalités à l'application. Nous en profiterons pour vous présenter les nouvelles fonctionnalités de symfony ainsi que les bonnes pratiques de développement web.
Pour askeet, le 21ième jour était : "payez vous un gourou symfony pour un jour". Nous n'avions pas de plan et la communauté devait nous proposer une fonctionnalité à ajouter à askeet. Ce fût un énorme succès et la communauté décida que l'application devait avoir un moteur de recherche. Et nous l'avons fait. Le 21ième jour a également montré, que c'était l'un des plus populaires du tutoriel askeet.
Pour Jobeet, nous avons célébré le jour de l'hiver ce 21 Décembre par un "jour du design". Le design gagnant a été présenté par le centre{source}, et est utilisé dans ce tutoriel pour le design par défaut. Il est également utilisé pour le design du site Jobeet.
Ce tutoriel est différent
Rappelez-vous les premiers jours de PHP4. Ah, la Belle Epoque ! PHP est l'un des premiers langages dédiés au web et l'un des plus facile à apprendre.
Mais comme les technologies du web évoluent à un rythme très rapide, les développeurs Web doivent se tenir au courant sur les dernières meilleures pratiques et les outils. La meilleure façon d'apprendre est bien sûr par la lecture des blogs, des tutoriels et des livres. Nous avons lu beaucoup d'entre eux, qu'ils soient écrits pour PHP, Python, Java, Ruby ou Perl, et beaucoup d'entre eux nous laisse sur notre faim lorsque l'auteur commence à donner des morceaux de codes à titre d'exemples.
Vous êtes sans doute habitués à lire des avertissements du genre:
«Pour une application réelle, n'oubliez pas d'ajouter la validation et la manipulation d'erreur appropriée.»
Ou
«La sécurité est laissée en exercice au lecteur.»
Ou
«Vous aurez bien sûr besoin d'écrire des tests.»
Pardon ? Ces choses sont sérieuses. Ils sont peut-être la partie la plus importante de tout morceau de code. Et en tant que lecteur, on vous laisse seuls. Sans que ces préoccupations soient prises en compte, les exemples sont beaucoup moins utiles. Vous ne pouvez pas les utiliser comme un bon point de départ. C'est très grave ! Pourquoi ? Parce que la sécurité, la validation, le traitement des erreurs et les tests, pour n'en nommer que quelques-uns, sont importants pour avoir un bon code.
Dans ce tutoriel, vous ne verrez jamais des déclarations car nous allons écrire des tests, la gestion d'erreur, le code de validation, et soyez sûr que nous développons une application sécurisée. C'est parce que symfony est sur??? le code, mais également sur les meilleures pratiques et comment développer des applications professionnelles pour l'entreprise. Nous serons en mesure de se permettre ce luxe, car symfony fournit tous les outils nécessaires pour coder ces aspects aisément sans écrire trop de code.
La validation, la manipulation d'erreur, la sécurité, et les tests sont des citoyens de première classe dans symfony, ainsi cela ne nous prendra pas trop de temps à expliquer. Ce n'est là qu'une des nombreuses raisons d'utiliser un framework pour la «vie réelle» des projets.
Tout le code que vous lirez dans ce tutoriel est un code que vous pourriez utiliser pour un projet réel. Nous vous encourageons à copier/coller des bouts de code ou de voler des morceaux entiers.
Le Projet
L'application qui va être conçue aurait pu être encore un autre moteur de blog. Mais nous voulons utiliser symfony pour un projet utile. L'objectif est de montrer que symfony peut être utilisé pour développer des applications professionnelles avec du style et peu d'effort.
Nous conserverons le contenu du projet secret jusqu'au prochain jour car nous avons à faire aujourd'hui. Vous connaissez déjà le nom de l'application : Jobeet.
Qu'allons nous faire aujourd'hui ?
Comme 24 heures représentent un temps suffisant pour développer une application avec symfony, nous n'écrirons pas de code PHP aujourd'hui. Mais même sans écrire une ligne de code, vous allez commencer à comprendre les bénéfices de l'utilisation d'un framework comme symfony seulement en mettant en place un nouveau projet.
L'objectif du jour est d'installer l'environnement de développement et d'afficher une page de l'application dans un navigateur. Cela demande d'installer symfony, de créer une application, et de configurer un serveur web.
Prérequis
Avant tout, vérifiez que vous avez un environnement de développement web avec un serveur web (Apache par exemple), un moteur de base de données (Mysql, PostgreSQL, SQLite), et PHP dans sa version 5.2.4 ou supérieure.
Comme nous utilisons beaucoup la ligne de commande, il est préférable d'utiliser un Unix-like OS.
Si vous utilisez un système Windows, cela fonctionnera également, vous devrez seulement taper
quelques commandes à l'invite de cmd
.
note
Les commandes shell Unix sont pratiques dans un environnement Windows.
Si vous voulez utiliser des outils comme tar
, gzip
, ou grep
dans Windows,
vous pouvez installer Cygwin. La documentation officielle est un peu
petite, mais un bon guide d'installation est disponible
ici.
Les aventureux pourront essayer les
Windows Services for Unix de Microsoft.
Comme ce tutoriel se concentre plus particulièrement sur le framework symfony, nous considérerons que vous disposez déjà d'un solide bagage en PHP5 et programmation Orientée Objet.
L'installation de symfony
Premièrement, créer un répertoire pour enregistrer les fichiers du projet Jobeet :
$ mkdir -p /home/sfprojects/jobeet $ cd /home/sfprojects/jobeet
Sous Windows:
c:\> mkdir c:\development\sfprojects\jobeet c:\> cd c:\development\sfprojects\jobeet
note
Nous conseillons aux utilisateurs de Windows de faire fonctionner symfony et d'installer leur nouveau
projet dans un chemin qui ne contient pas d'espaces.
Éviter d'utiliser le dossier Documents and Settings
et
Mes Documents
.
Créer un répertoire pour enregistrer les fichiers de la librairie du framework symfony :
$ mkdir -p lib/vendor
La page d'installation sur le site de symfony liste et compare toutes les versions disponibles de symfony.
Comme le tutoriel est écrit pour symfony version 1.2, aller à la page d'installation pour symfony 1.2.
En dessous de la section "Source Download", vous trouverez l'archive au format
tgz
ou .zip
. Téléchargez l'archive et mettez la dans le dossier lib/vendor
fraîchement créée, puis décompressez la.
$ cd lib/vendor $ tar zxpf symfony-1.2.2.tgz $ mv symfony-1.2.2 symfony $ rm symfony-1.2.2.tgz
Sous Windows, la décompression du fichier zip peut être fait avec l'explorateur. Après
avoir renommé le répertoire en symfony
, vous devriez avoir un répertoire nommé
c:\development\sfprojects\jobeet\lib\vendor\symfony
.
Comme la configuration de PHP varie d'une distribution à une autre, nous devons vérifier que votre configuration PHP répond aux exigences minimums de symfony. Exécutez le script de vérification de configuration fournit avec symfony à partir de la ligne de commande :
$ cd ../.. $ php lib/vendor/symfony/data/bin/check_configuration.php
S'il y a un problème, la sortie vous donnera les conseils pour le résoudre. Vous devez également exécuter la vérification à partir d'un navigateur car la configuration PHP peut être différente. Copiez le fichier quelque part dans le répertoire racine du serveur web et accédez au fichier. N'oubliez pas de supprimer le fichier à partir du répertoire racine web après:
$ rm web/check_configuration.php
Si le script n'affiche aucune erreur, vérifiez que symfony est installé
correctement en utilisant la ligne de commande|Ligne de Commande de symfony pour afficher la
version (notez V
en majuscule) :
$ php lib/vendor/symfony/data/bin/symfony -V
Sous Windows:
c:\> cd ..\.. c:\> php lib\vendor\symfony\data\bin\symfony -V
Si vous êtes curieux et que vous voulez voir ce que la ligne de commande peut
faire pour vous, tapez symfony
pour lister les options et les tâches disponibles :
$ php lib/vendor/symfony/data/bin/symfony
Sous Windows:
c:\> php lib\vendor\symfony\data\bin\symfony
La ligne de commande symfony est la meilleure amie du développeur. Elle fournit un ensemble d'utilitaire qui augmente votre productivité pour vos activités de tous les jours comme vider le cache, générer du code, et beaucoup plus encore.
Installation du Projet
Dans symfony les applications partagent le même modèle de données et sont regroupées par projets. Pour le projet Jobeet nous aurons deux applications différentes : une nommée frontend|Frontend et l'autre backend|Backend.
Création du Projet
A partir du répertoire jobeet
exécuter la tâche symfony generate:project
pour créer le projet.
$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet
Sous Windows:
c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet
La tâche generate:project
génère la structure|Structure par défaut des répertoires et
crée les fichiers nécessaires d'un projet symfony.
Directory | Description |
---|---|
apps/ | Contient les applications du projet |
cache/ | Les fichiers en cache |
config/ | Les fichiers de configuration du projet |
lib/ | Les librairies et classes du projet |
log/ | Les fichiers de logs du framework |
plugins/ | Les plugins installés |
test/ | Les tests unitaires et fonctionnels |
web/ | Le répertoire racine web (voir dessous) |
note
Pourquoi symfony génère autant de fichiers ? Un des bénéfices d'utiliser un framework hiérarchisé c'est de standardiser vos développements. Grâce à la structure par défaut des fichiers et répertoires de symfony, n'importe quel développeur connaissant symfony peut reprendre n'importe quel projet symfony. En quelques minutes, il sera à même de naviguer dans le code, de corriger les bogues, et d'ajouter de nouvelles fonctionnalités.
La tâche generate:project
a également créé un raccourci symfony
à la racine
du projet Jobeet pour faciliter l'écriture de la commande lorsque vous exécutez
une tâche.
À partir de maintenant, au lieu d'utiliser le chemin complet pour exécuter la
commande symfony, nous utiliserons le raccourci symfony
.
Création d'application
Créez l'application frontend en exécutant la tâche generate:app
:
$ php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
tip
Comme le raccourci symfony est exécutable, les utilisateurs Unix peuvent remplacer
chaque occurrence 'php symfony
' par './symfony
' dès maintenant.
Pour Windows vous pouvez copier le fichier 'symfony.bat
' dans votre projet et
utiliser 'symfony
' à la place de 'php symfony
' :
c:\> copy lib\vendor\symfony\data\bin\symfony.bat .
Basé sur le nom de l'application donnée comme argument, la tâche generate:app
crée la structure de répertoire par défaut nécessaire à l'application sous le
répertoire apps/frontend
:
Répertoire | Description |
---|---|
config/ | Les fichiers de configuration de l'application |
lib/ | Les librairies et classes de l'application |
modules/ | Le code de l'application (MVC) |
templates/ | Les Templates principaux |
tip
Toutes les commandes symfony
doivent être exécutées à partir du répertoire
racine du projet, sauf si le contraire est explicitement indiqué.
Lorsque nous avons appelé la tâche generate:app
nous avons passé deux options
pour la sécurité :
--escaping-strategy
: Active les échappements pour prévenir des attaques XSS--csrf-secret
: Active les jetons de sessions des formulaires pour prévenir des attaques CSRF
En passant ces deux options à la tâche, nous avons sécurisé notre futur développement des deux plus courantes vulnérabilités trouvées sur le web. C'est bien, symfony va automatiquement prendre les mesures de sécurité|Sécurité pour nous.
Le Chemin de Symfony
Vous pouvez voir la version de symfony utilisée par votre projet en tapant :
$ php symfony -V
L'option V
affiche également le chemin vers le répertoire d'installation de
symfony, que vous retrouvez également dans le fichier config/ProjectConfiguration.class.php
:
// config/ProjectConfiguration.class.php require_once '/Users/fabien/work/symfony/dev/1.2/lib/autoload/sfCoreAutoload.class.php';
Pour une meilleure portabilité du projet, changez le chemin absolu de l'installation de symfony par un chemin relatif :
// config/ProjectConfiguration.class.php require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
De cette façon vous pouvez déplacer votre projet Jobeet n'importe où sur votre machine ou sur une autre, cela fonctionnera toujours.
Les environnements
Si vous regardez le répertoire web/
, vous trouverez deux fichiers PHP :
index.php
et frontend_dev.php
. Ces fichiers sont appelés
contrôleurs frontaux|Contrôleurs Frontaux; toutes les requêtes de l'application
se font par leur intermédiaire. Mais pourquoi nous avons deux contrôleurs frontaux alors
que nous avons qu'une application ?
Les deux fichiers pointent sur la même application mais pour des environnements différents. Lorsque vous développez une application, sauf si vous développez directement sur le serveur de production, vous avez besoin de plusieurs environnements :
- L'environnement de développement : C'est l'environnement utilisé par les développeurs Web quand ils travaillent sur l'application pour ajouter de nouvelles fonctionnalités, corriger des bugs, ...
- L'environnement de test : Cet environnement est utilisé pour tester automatiquement l'application.
- L'environnement de qualité : Cet environnement est utilisé par le client pour tester l'application et les bogues ou les fonctionnalités manquantes.
- L'environnement de production : C'est l'environnement où interagissent les utilisateurs finaux
Qu'est ce qui rend un environnement unique ? Dans l'environnement de développement par exemple, l'application doit se connecter à tous les détails d'une requête afin de faciliter le débogage, mais le système de cache doit être désactivé de façon que tous les changements apportés au code soient pris en compte sans tarder. Ainsi, l'environnement de développement doit être optimisé pour le développeur. Le meilleur exemple est certainement lorsqu'une exception|Exception se produit. Pour aider le développeur à déboguer le problème plus rapidement, symfony affiche l'exception avec toutes les informations qu'elle a sur la requête courante dans le navigateur :
Par contre sur l'environnement de production, la couche du cache doit être activé, et bien entendu, l'application doit afficher les messages d'erreurs à la place des exceptions. Ainsi, l'environnement de production doit être optimisé pour la performance et l'expérience utilisateur.
Un environnement de symfony est un ensemble unique de paramètres de configuration. Le framework
symfony est livré avec trois d'entre eux : dev
, test
, et prod
. Durant
la journée 22, vous apprendrez à créer de nouveaux environnements, comme celle de staging
.
Si vous ouvrez les fichiers des contrôleurs frontaux, vous verrez que leur contenu est le même, sauf pour la configuration de l'environnement :
// web/index.php <?php require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); sfContext::createInstance($configuration)->dispatch();
note
La définition d'un nouvel environnement de symfony est aussi simple que la création d'un nouveau contrôleur frontal. Nous verrons plus tard comment modifier les paramètres d'un environnement.
Configuration du serveur web : la pire méthode
Dans la section précédente, un répertoire a été créée pour héberger le projet Jobeet. Si vous l'avez créée quelque part en dessous de la racine web de votre serveur, vous pouvez dès à présent y accéder par un navigateur.
Bien sûr comme cela vous n'avez rien à configurer, c'est très rapide à installer, mais essayer
d'accéder au ficher config/databases.yml
à partir de votre navigateur pour comprendre les
mauvaises conséquences que peuvent avoir une attitude de paresseux. Si l'utilisateur sait que votre
site est développé avec symfony, il aura accès à un grand nombre de fichiers
sensibles.
Ne jamais utiliser cette installation sur un serveur de production et lisez la section suivante pour apprendre à configurer correctement votre serveur web.
Configuration du server web : la méthode sécurisée
Une bonne pratique pour le web est de mettre seulement sous la racine web les
fichiers qui seront appelés par un navigateur comme les feuilles de style, les
fichiers Javascript ou les images. Par défaut nous vous recommandons de stocker
ces fichiers dans des sous-répertoires du dossier web
de votre projet symfony.
Si vous regardez ce répertoire, vous trouverez des sous-répertoires avec les éléments cités ci-dessus et les deux fichiers des contrôleurs frontaux. Les contrôleurs frontaux sont les seuls fichiers PHP qui doivent être sous la racine web. Tous les autres fichiers PHP doivent être inaccessible par un navigateur, ce qui est une bonne idée notamment pour la sécurité.
Configuration du serveur web
Maintenant il est temps de modifier votre configuration d'Apache pour rendre accessible au monde entier votre projet.
Trouvez et ouvrez votre fichier de configuration httpd.conf
puis ajoutez ces
lignes à la fin :
# Soyez certain de n'avoir cette ligne qu'une seule fois dans votre fichier NameVirtualHost 127.0.0.1:8080 # Configuration pour Jobeet Listen 127.0.0.1:8080 <VirtualHost 127.0.0.1:8080> DocumentRoot "/home/sfprojects/jobeet/web" DirectoryIndex index.php <Directory "/home/sfprojects/jobeet/web"> AllowOverride All Allow from All </Directory> Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>
note
l'alias /sf
vous donne accès aux images et fichiers Javascript
nécessaires au bon affichage des pages par défaut de symfony et de la barre
d'outils web de débogage (web debug toolbar)
Pour Windows, vous devez remplacer la ligne Alias
avec quelque chose comme :
Alias /sf "c:\development\symfony\data\web\sf"
/home/sfprojects/jobeet/web
doit être remplacé par :
c:\development\sfprojects\jobeet\web
Cette configuration fait écouter Apache sur le port 8080
de votre machine,
donc le site Jobeet sera accessible par l'adresse :
http://localhost:8080/
Vous pouvez changer ce numéro de port 8080
par un autre numéro mais utilisez
en un supérieur à 1024 car il ne nécessite pas de droits administrateurs.
Tester la nouvelle configuration
Redémarrez Apache, et vérifiez que vous avez accès à la nouvelle application à
partir d'un navigateur en tapant http://localhost:8080/index.php/
, ou
http://jobeet.localhost/index.php/
cela dépend de la configuration d'Apache
que vous avez choisi dans les sections précédentes.
note
Si vous avez installé le module d'Apache mod_rewrite
|mod_rewrite
(Apache)
vous pouvez supprimer la partie index.php/
dans l'URL. Ceci est
possible grâce à la réécriture des règles configurées dans le
fichier web/~.htaccess|.htaccess (Apache)~
.
Vous pouvez également essayer d'accéder à l'environnement de développement de l'application par l'adresse :
http://jobeet.localhost/frontend_dev.php/
La barre d'outils web de débogage doit être présente en haut dans le coin droit, incluant de petites
icônes. C'est la preuve que votre alias de configuration sf/
est correct.
La barre d'outils web de débogage|Barre d'Outils Web de Débogage est présente sur toutes les pages dans l'environnement de développement et vous donne accès à un grand nombre d'informations en cliquant sur les différents onglets : la configuration de l'application actuelle, les journaux pour la requête actuelle, les instructions SQL exécutées sur le moteur de la base de données, les informations sur la mémoire et l'information du temps.
note
L'installation est un petit peu différente si vous voulez exécuter symfony à partir d'un serveur IIS dans un environnement Windows. Vous trouverez comment le configurer dans ce tutoriel.
Subversion
C'est une bonne pratique d'utiliser le contrôle de version des sources lors du développement d'une application web. En utilisant un contrôle de version des sources, cela nous permet de :
- travailler en toute confiance
- revenir à une version précédente si un changement casse quelquechose
- permettre à plusieurs personnes de travailler efficacement sur le projet
- avoir accès à toutes les versions successives de l'application
Dans cette section, nous décrirons comment utiliser Subversion avec symfony. Si vous utilisez un autre outil de contrôle de code source, il doit être assez facile d'adapter ce que nous décrivons pour Subversion.
Nous supposons que vous avez déjà accès à un serveur Subversion et que vous pouvez y accéder via HTTP.
tip
Si vous ne disposez pas d'un serveur Subversion à votre disposition, vous pouvez créer un dépôt gratuit sur Google Code ou tapez simplement "free subversion repository" dans Google pour avoir beaucoup plus d'options.
Tout d'abord, créer un dépôt pour le projet jobeet sur le serveur de dépôt :
$ svnadmin create /path/to/jobeet/repository
Sur votre machine, créez la structure de répertoires de base :
$ svn mkdir -m "creer la structure de repertoires par defaut" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches
Et faites un checkout du répertoire vide trunk/
:
$ cd /home/sfprojects/jobeet $ svn co http://svn.example.com/jobeet/trunk/ .
Ensuite, supprimez le contenu des répertoires cache/
et log/
car nous ne
voulons pas les mettre dans le dépôt.
$ rm -rf cache/* log/*
Maintenant, assurez-vous de mettre les permissions d'écriture sur les répertoires du cache et des journaux aux niveaux appropriés afin que votre serveur web puisse écrire dedans :
$ chmod 777 cache/ log/
Maintenant, importer tous les fichiers et répertoires :
$ svn add *
Comme nous ne voudrons jamais faire de commit des fichiers situés dans les répertoires
cache/
et log/
, vous devez spécifier une liste à ignorer :
$ svn propedit svn:ignore cache
L'éditeur de texte par défaut configuré dans SVN devrait se lancer. Subversion doit ignorer tout le contenu de ce répertoire :
*
Sauvegardez et quittez. Vous avez terminé.
Répétez la procédure pour le répertoire log/
:
$ svn propedit svn:ignore log
Et entrez :
*
Enfin, valider ces modifications dans le dépôt :
$ svn import -m "fait l import initial" . http://svn.example.com/jobeet/trunk
tip
Les utilisateurs de Windows~ peuvent utiliser l'excellent client TortoiseSVN pour gérer leur dépôt Subversion.
A demain
Bien, c'est fini pour aujourd'hui ! Même si nous n'avons pas encore parlé de symfony, nous avons installé un environnement de développement solide, nous avons parlé des bonnes pratiques de développement web, et nous sommes prêt à coder.
Demain nous révélerons ce que l'application fait et nous parlerons des exigences que nous devons mettre en œuvre durant le tutoriel.
note
Si vous souhaitez vérifier le code pour aujourd'hui, ou pour un autre jour, le code est
disponible jour après jour dans le dépôt officiel SVN Jobeet
(http://svn.jobeet.org/propel/
).
Par exemple, vous pouvez avoir le code d'aujourd'hui en cochant la
balise release_day_01
:
$ svn co http://svn.jobeet.org/propel/tags/release_day_01/ jobeet/
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License license.