On vient d'extraire beaucoup de fichiers, mais sans savoir encore à quoi ils servent. C'est le moment d'éclaircir tout cela !
Liste des répertoires
Ouvrez donc le répertoire dans lequel vous avez extrait les fichiers. Vous pouvez voir qu'il n'y a pas beaucoup de fichier ici, seulement des répertoires. En effet tout est bien rangé dans chaque répertoire, il nous faut donc élucider ces répertoires. En voici la liste :
Code : Autre
Le répertoire app/
Ce répertoire contient tout ce qui concerne votre site internet sauf... son code source. Assez étrange me direz vous

. En fait c'est simplement pour séparer le code source qui fait la logique de votre site du reste. Le reste, c'est ce répertoire app. Et ce reste c'est : la configuration, le cache, les fichiers logs, etc. Ce sont des fichiers qui concernent l'entièreté de votre site, contrairement aux fichiers de code source qui seront découpés par fonctionnalités de votre site.
Dans Symfony2, un projet de site internet est une
application, simple question de vocabulaire. Le répertoire
app/ est donc le raccourci pour application.
Le répertoire bin/
Ce répertoire ne contient qu'un seul script pour mettre à jour les librairies tierces. C'est celui que vous avez exécuté au chapitre précédent si Git est installé sur votre ordinateur.
Si vous n'avez pas Git ou ne savez pas ce que c'est, ce répertoire ne vous est d'aucune utilité.
Le répertoire src/
Voilà enfin le répertoire dans lequel on mettra le code source ! C'est ici que l'on passera le plus clair de notre temps. Dans ce répertoire, nous organiserons notre code en "
bundles", des briques de notre application, dont nous verrons la définition plus loin.
Vous pouvez voir qu'il n'est pas vide : il contient en effet quelques fichiers exemples, fournis par Symfony2. Nous les supprimerons plus tard dans ce tutoriel.
Le répertoire vendor/
Ce répertoire contient toutes les librairies externes à notre application. Dans ces librairies externes, j'inclue Symfony2 ! Vous pouvez parcourir ce répertoire, vous y trouverez des librairies comme Doctrine, Twig, SwiftMailer, etc.
Et une librairie, c'est quoi exactement ?
Une librairie est une sorte de boite noire qui remplit une fonction bien précise, et dont on peut se servir dans notre code. Par exemple, la librairie SwiftMailer permet d'envoyer des emails. On ne sait pas comment elle fonctionne (principe de la boite noire), mais on sait comment s'en servir : on pourra donc envoyer des emails très facilement, juste en apprenant rapidement à utiliser la librairie.
Le répertoire web/
Ce répertoire contient tous les fichiers destinés à vos visiteurs : images, fichiers CSS et JavaScript, etc. Il contient également le contrôleur frontal (app.php), dont nous parlerons juste après.
En fait c'est le seul répertoire qui devrait être accessible à vos visiteurs. Les autres répertoires ne sont pas censés être accessibles (ce sont vos classes, elles vous regardent vous, pas vos visiteurs), c'est pourquoi vous y trouverez des fichiers .htaccess interdisant l'accès depuis l'extérieur. On utilisera donc toujours des URL du type
http://localhost/Symfony/web/... au lieu de simplement
http://localhost/Symfony/....
A retenir
Retenez donc que nous passerons la plupart de notre temps dans le répertoire
src/, à travailler sur nos
bundles. On touchera également pas mal au répertoire
app/ pour configurer notre application. Et lorsque nous installerons des
bundles téléchargés, nous le ferons dans le répertoire
vendor/.
Le contrôleur frontal
Définition
Le contrôleur frontal (
front controller, en anglais) est le point d'entrée de votre application. C'est
le fichier par lequel passent toutes vos pages. Vous devez surement connaitre le principe du
index.php et des pseudo-frames (avec des URL du type
index.php?page=blog), et bien ce
index.php est un contrôleur frontal.
Dans Symfony2, le contrôleur frontal se situe dans le répertoire
web/, il s'agit de
app.php ou
app_dev.php.
Pourquoi y a-t-il deux contrôleurs frontaux ? Normalement c'est un fichier unique qui gère toutes les pages non ?
Vous avez parfaitement raison... pour un code classique ! Nous travaillons maintenant avec Symfony2, et son objectif est de nous faciliter le développement. C'est pourquoi Symfony2 propose un contrôleur frontal pour nos visiteurs,
app.php, et un contrôleur frontal lorsque nous développons,
app_dev.php. Ces deux contrôleurs frontaux, fournis par Symfony2 et prêts à l'emploi, définissent en fait deux environnements de travail.
Deux environnements de travail
L'objectif est de répondre au mieux suivant la personne qui visite le site :
- Un développeur a besoin d'informations sur la page afin de l'aider à développer. En cas d'erreur, il veut tous les détails pour pouvoir déboguer facilement. Il n'a pas besoin de rapidité.
- Un visiteur normal n'a pas besoin d'informations particulières sur la page. En cas d'erreur, l'origine de celles-ci ne l'intéresse pas du tout, il veut juste retourner d'où il vient. Par contre, il veut que le site soit le plus rapide possible à charger.
Vous voyez la différence ? A chacun ses besoins, et Symfony2 compte bien tous les remplir. C'est pourquoi il offre plusieurs
environnements de travail :
- L'environnement de développement, appelé « dev », accessible en utilisant le contrôleur frontal app_dev.php. C'est l'environnement que l'on utilisera toujours pour développer.
- L'environnement de production, appelé « prod », accessible en utilisant le contrôleur frontal app.php.
Essayez-les ! Allez sur
http://localhost/Symfony/web/app_dev.php et vous verrez une barre d’outils en bas de votre écran, contenant nombre d’informations utiles au développement. Allez sur
http://localhost/Symfony/web/app.php et vous obtiendrez... une erreur 404

. En effet, aucune page n'est définie par défaut pour le mode « prod ». Nous les définirons plus tard, mais notez que c'est une « belle » erreur 404, aucun terme barbare n'est employé pour la justifier

.
Pour voir le comportement du mode « dev » en cas d'erreur, essayez aussi d'aller sur une page qui n'existe pas. Vous avez vu ce que donne une page introuvable en mode « prod », mais allez maintenant sur
http://localhost/Symfony/web/app_dev.p [...] quinexistepas. La différence est claire : le mode « prod » nous dit juste « page introuvable » alors que le mode « dev » nous donne plein d'informations sur l'origine de l'erreur, indispensables pour la corriger.
C'est pourquoi, dans la suite du tutoriel, nous utiliserons toujours le mode « dev » en passant donc par
app_dev.php. Bien sûr, lorsque votre site sera opérationnel et que des internautes pourront le visiter, il faudra leur faire utiliser le mode « prod ». Mais nous n'en sommes pas encore là.
Et comment savoir quelles erreurs surviennent en mode production si elles ne s'affichent pas ?
C'est une bonne question, en effet si par malheur une erreur intervient pour l'un de vos visiteurs, il ne verra aucun message et vous non plus, une vraie galère pour déboguer ! En réalité si les erreurs ne sont pas affichées, elles sont bien stockées dans un fichier. Allez jeter un oeil au fichier
app/logs/prod.log qui contient plein d'informations sur les requêtes effectuées en mode production, dont les erreurs

.
Concrètement, qu'est-ce que contrôle le contrôleur frontal ?
Très bonne question. Pour cela, rien de tel que... d'ouvrir le fichier
app.php. Ouvrez-le et vous constaterez qu'il ne fait pas grand chose. En effet, le but du contrôleur frontal n'est pas de
faire quelque chose, mais d'être un
point d'entrée de notre application. Il se limite donc à appeler le noyau (Kernel) de Symfony2 en disant "
On vient de recevoir une requête, gère la s'il-te-plait".
Ici, voyez le contrôleur frontal comme un fichier à nous (il est dans notre répertoire
web/), et le Kernel comme un composant Symfony2, une boite noire (il est dans le répertoire
vendors/). Vous voyez comment on a utilisé notre premier composant Symfony2 : on a délégué la gestion de la requête au Kernel. Bien sûr ce Kernel aura besoin de nous pour savoir quoi exécuter comme code, mais il gère déjà plusieurs choses que nous avons vues : la gestion des erreurs, l'ajout de la toolbar en bas de l'écran, etc. On n'a encore rien fait, et pourtant on a déjà gagné du temps !