Tout est bundle
Rappelez-vous : dans Symfony2,
chaque partie de votre site est un bundle.
Pour créer notre première page, il faut donc d'abord créer notre premier
bundle. Rassurez-vous, créer un
bundle est extrêmement simple avec le générateur. Démonstration !
Exécuter la bonne commande
Comme on vient de l'apprendre, exécutez la commande
php app/console generate:bundle.
1. Choisir le namespace
Symfony2 vous demande le namespace de votre bundle :
Vous pouvez nommer votre namespace comme bon vous semble, il faut juste qu'il se termine par le suffixe "Bundle". Par convention, on le compose de trois parties. Nous allons nommer notre namespace «
Sdz\BlogBundle », explications :
- « Sdz » est le namespace racine : il vous représente. Vous pouvez mettre votre pseudo, le nom de votre site ou ce que vous voulez ;
- « Blog » est le nom du bundle en lui-même : il définit ce que fait le bundle. Ici, nous créons un blog, nous l'avons donc simplement appelé « Blog »
;
- « Bundle » est le suffixe obligatoire.
Rentrez donc dans la console Sdz/BlogBundle
Avec des slashes juste pour cette fois pour les besoins de la console, mais un namespace comprend des anti-slashes.
2. Choisir le nom
Symfony2 vous demande le nom de votre bundle :
Par convention, on nomme le bundle de la même manière que le namespace, sans les slashes. On a donc : SdzBlogBundle. C'est ce que Symfony2 vous propose par défaut, appuyez donc simplement sur "Entrée". Retenez ce nom, par la suite quand on parlera du nom du
bundle, cela voudra dire ce nom là : SdzBlogBundle.
3. Choisir la destination
Symfony2 vous demande l'endroit où vous voulez que les fichiers du bundle soient générés :
Par convention, comme on l'a vu, on place nos
bundles dans le répertoire
src/. C'est ce que Symfony2 vous propose, appuyez donc sur "Entrée".
4. Choisir le format de configuration
Symfony2 vous demande sous quelle forme vous voulez configurer votre bundle. Il s'agit simplement du format de la configuration, configuration que nous ferons plus tard. Il existe plusieurs moyens comme vous pouvez le voir : Yaml, XML, PHP ou Annotations.
Chacune a ses avantages et inconvénients. Nous allons utiliser le Yaml (yml) ici, car est il bien adapté pour un bundle. Mais sachez que nous utiliseront les annotations pour nos futures entités par exemple. Entrez donc
yml.
5. Choisir quelle structure générer
Symfony2 vous demande si vous voulez générer juste le minimum ou une structure plus complète pour le bundle :
Faisons simple et demandons à Symfony2 de tout nous générer. Entrez donc
yes.
6. Confirmez, et c'est joué !
Pour toutes les questions suivantes, confirmez en appuyant sur "Entrée" à chaque fois. Et voilà, votre bundle est généré :
Mais, pourquoi il n'y a pas la toolbar en bas de la page ?
C'est normal, c'est juste un petit truc à savoir pour éviter de s'arracher les cheveux inutilement

. La
toolbar est un petit bout de code HTML que rajoute Symfony2 à chaque page... contenant la balise
</body>. Or sur cette page, vous pouvez afficher la source depuis votre navigateur, il n'y a aucune balise HTML en fait, donc Symfony2 n'ajoute pas la
toolbar.
Pour l'activer rien de plus simple, il nous faut rajouter une toute petite structure HTML. Pour cela ouvrez le fichier
src/Sdz/BlogBundle/Resources/views/Default/index.html.twig, c'est la vue utilisée pour cette page. L'extension "
.twig" signifie qu'on utilise le moteur de
templates Twig pour gérer nos vues, on en reparlera bien sûr. Le fichier est plutôt simple, et je vous propose de le changer ainsi :
Code : HTML | <html>
<body>
Hello {{ name }}!
</body>
</html>
|
Actualisez la page, et voilà une magnifique
toolbar apparait en bas de la page ! Seule la balise
</body> suffisait, mais quitte à changer autant avoir une structure HTML valide

.
Que s'est-il passé ?
Dans les coulisses, Symfony2 a fait pas mal de choses, revoyons tout ça à notre rythme.
Symfony2 a généré la structure du bundle
Allez dans le répertoire
src/Sdz/BlogBundle, vous pouvez voir tout ce que Symfony2 a généré pour nous. Rappelez-vous la structure d'un bundle que nous avons vu au chapitre précédent : Symfony2 en a généré la majorité !
A savoir : le seul fichier obligatoire pour un bundle est en fait la classe
SdzBlogBundle.php à la racine du répertoire. Vous pouvez l'ouvrir et voir ce qu'il contient : pas très intéressant en soi ; tant mieux que Symfony l'ait généré tout seul

. Sachez-le dès maintenant : nous ne modifierons presque jamais ce fichier, vous pouvez passer votre chemin.
Symfony2 a enregistré notre bundle auprès du Kernel
Le
bundle est créé, mais il faut dire à Symfony2 de le charger. Pour cela il faut configurer le noyau (le Kernel) pour qu'il le charge. Rappelez-vous, la configuration de l'application se trouve dans le répertoire
app/. En l’occurrence, la configuration du noyau se fait dans le fichier
app/AppKernel.php :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | <?php
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
new Symfony\Bundle\AsseticBundle\AsseticBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
new Sdz\BlogBundle\SdzBlogBundle()
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
}
return $bundles;
}
// ...
|
Cette classe permet donc uniquement de définir quels
bundles charger pour l'application. Vous pouvez le voir, ils sont instanciés dans un simple tableau. Les lignes 10 à 21 définissent les
bundles à charger pour l'environnement de production. Les lignes 24 à 26 définissent les
bundles à charger
en plus pour l'environnement de développement.
Comme vous pouvez le voir, le générateur du
bundle a modifié lui-même ce fichier pour y rajouter la ligne 20, surlignée en jaune. C'est ce que l'on appelle "enregistrer le
bundle dans l'application".
Vous pouvez voir également qu'il en existe plein d'autres, ce sont tous les
bundles par défaut qui apportent des fonctionnalités de base au
framework Symfony2. En fait, quand on parle de Symfony2, on parle à la fois de ses composants (Kernel, Routeur, etc.) et de ses
bundles.
Symfony2 a enregistré nos routes auprès du Routeur
Les routes ? Le Routeur ?
Pas de panique nous verrons tout cela dans les prochains chapitres. Sachez juste pour l'instant que le rôle du Routeur, que nous avons brièvement vu sur le schéma du chapitre précédent, est de déterminer quel contrôleur exécuter en fonction de l'URL appelée. Pour cela, il utilise les routes.
Chaque
bundle dispose de ses propres routes. Pour notre
bundle fraîchement créé, vous pouvez les voir dans le fichier
src/Sdz/BlogBundle/Resources/config/routing.yml (il n'y en a qu'une seule). Or ces routes ne sont pas chargées automatiquement, il faut dire au Routeur "
Bonjour, mon bundle SdzBlogBundle contient des routes qu'il faut que tu viennes chercher". Cela se fait, vous l'aurez deviné, dans la configuration de l'application. Cette configuration se trouve toujours dans le répertoire
app/, en l'occurrence pour les routes il s'agit du fichier
app/config/routing.yml :
Code : Autre1
2
3
| SdzBlogBundle:
resource: "@SdzBlogBundle/Resources/config/routing.yml"
prefix: / |
Ce sont ces lignes qui importent le fichier de routes situé dans notre
bundle. Ces lignes ont déjà été générée par le générateur de
bundle, vraiment pratique lui !
A retenir
Ce qu'il faut retenir de tout cela, c'est que pour qu'un bundle soit opérationnel il faut :
- Son code source, situé dans src/Application/Bundle, et dont le seul fichier obligatoire est la classe à la racine SdzBlogBundle.php
- Enregistrer le bundle dans le noyau pour qu'il soit chargé, en modifiant le fichier app/AppKernel.php
- Enregistrer les routes (si le bundle en contient) dans le Routeur pour qu'elles soient chargées, en modifiant le fichier app/config/routing.yml
Ces trois points sont bien sûr effectués automatiquement lorsqu'on utilise le générateur. Mais vous pouvez tout à fait créer un bundle sans l'utiliser, et il faudra alors remplir cette petite
checklist.
Par la suite, tout notre code source sera situé dans des
bundles. Un moyen très propre de bien structurer son application.