Aller au menu - Aller au contenu

Icône Utilisons la console pour créer un bundle

Avatar
Mise à jour : 02/05/2012
Difficulté : Facile Facile Durée d'étude : 2 heures Creative Commons BY-NC-SA
20 752 visites depuis 7 jours, dont 999 sur ce chapitre classé 17/786
Dans ce chapitre nous allons créer notre premier bundle, juste histoire d'avoir la structure de base de notre code futur. Mais nous ne le ferons pas n'importe comment : nous allons générer le bundle en utilisant une commande Symfony2 en console !

L'objectif est de découvrir la console utilement.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Utilisation de la console

Tout d'abord, vous devez savoir une chose : Symfony2 intègre des commandes disponibles non pas via le navigateur, mais via l'invite de commandes (sous Windows) ou le terminal (sous Linux). Il existe pas mal de commandes qui vont nous servir assez souvent lors du développement, apprenons donc dès maintenant à utiliser cette console !

Les outils disponibles en ligne de commandes ont pour objectif de nous faciliter la vie. Ce n'est pas un obscur programme pour les geek amoureux de la console ! Vous pourrez à partir de là générer une base de code source pour certains fichiers récurrent, vider le cache, ajouter des utilisateurs par la suite, etc. N'ayez pas peur de cette console ;) .

Sous Windows


Lancez l'invite de commandes : Menu Démarrer > Programmes > Accessoires > Invite de commandes.

Image utilisateur

Puis placez vous dans le répertoire où vous avez mis Symfony2, en utilisant la commande Windows cd (je vous laisse adapter la commande) :

Image utilisateur

On va exécuter des fichiers PHP depuis cette invite de commandes. En l'occurence c'est le fichier app/console (ouvrez-le, c'est bien du PHP) que nous allons exécuter. Pour cela, il faut lancer la commande PHP avec le nom du fichier en argument : php app/console. C'est parti :

Image utilisateur

Et voila, vous venez d'exécuter une commande Symfony ! Celle-ci ne fait rien, c'était juste un entrainement.

La commande ne fonctionne pas ? Il vous dit que PHP n'est pas un exécutable ? Vous avez dû oublier d'ajouter PHP dans votre variable PATH, on l'a fait au chapitre précédent, jetez y un oeil.


Sous Linux et Mac


Ouvrez le terminal. Placez vous dans le répertoire où vous avez mis Symfony2, certainement /var/www pour Linux ou /user/sites pour Mac. Le fichier que nous allons exécuter est app/console, il faut donc lancer la commande php app/console. Je ne vous fais pas de capture d'écran, mais j'imagine que vous savez le faire !

A quoi ça sert ?


Une très bonne question, qu'il faut toujours se poser. :)
La réponse est très simple : à nous simplifier la vie !

Depuis cette console, on pourra par exemple créer une base de données, vider le cache, ajouter ou modifier des utilisateurs (sans passer par phpMyAdmin !), etc. Mais ce qui nous intéresse dans ce chapitre, c'est la génération de code.

En effet, pour créer un bundle, un modèle ou un formulaire, le code de départ est toujours le même. C'est ce code là que le générateur va écrire pour nous. Du temps de gagné !

Comment ça marche ?


Comment Symfony2, un framework pourtant écrit en PHP, peut-il avoir des commandes en console ?

Vous devez savoir que PHP peut s'exécuter depuis le navigateur, mais également depuis la console. En fait côté Symfony2, tout est toujours écrit en PHP, il n'y a rien d'autre. Pour en être sûr, ouvrez le fichier app/console :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php

require_once __DIR__.'/bootstrap.php.cache';
require_once __DIR__.'/AppKernel.php';

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = !$input->hasParameterOption(array('--no-debug', ''));

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->run();

Vous ne remarquez rien ? Il ressemble beaucoup au contrôleur frontal app.php ! En fait il fait presque la même chose, il inclut les mêmes fichiers, et charge également le Kernel. Mais il définit la requête comme venant de la console, ce qui exécute du code différent par la suite. On pourra nous aussi écrire du code qui sera exécuté non pas depuis le navigateur (comme les contrôleurs habituels), mais depuis la console. Rien ne change pour le code, si ce n'est que l'affichage ne peut pas être en HTML bien évidemment.

Créons notre bundle

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 :

Image utilisateur


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 :
  1. « Sdz » est le namespace racine : il vous représente. Vous pouvez mettre votre pseudo, le nom de votre site ou ce que vous voulez ;
  2. « 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 » :p ;
  3. « 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 :

Bundle name


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 :

Target dir

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.

config format

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 :

dir structure ?

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é :

final


Tout d'abord, je vous réserve une petite surprise : allez voir sur http://localhost/Symfony/web/app_dev.php/hello/winzou ! Le bundle est déjà opérationnel !
Le code-exemple généré affiche le texte passé dans l'URL, vous pouvez donc également essayer ceci : http://localhost/Symfony/web/app_dev.php/hello/World.

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 :p . 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
1
2
3
4
5
<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 :p . 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 : Autre
1
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.
Voilà votre bundle est maintenant prêt ! A partir de là nous pourrons développer notre propre code et enfin faire notre première page. Tout ceci sera détaillé dans la prochaine partie.

Cette première partie vous aura montré les possibilités immenses qu'offre Symfony2... sans pour l'instant écrire une seule ligne de code !

Retenez bien également l'utilisation de la console. Nous nous en servirons de temps en temps, à chaque fois que Symfony2 propose des commandes pour améliorer notre vie de développeur ;) .

Tous les chapitres de cette première partie ont été intelligemment relus et corrigés par narzil, un grand merci !
Chapitre précédent Sommaire Chapitre suivant

Partager

9 commentaires pour "Utilisons la console pour créer un bundle"
Note moyenne : 3.75 / 4 (245 votes)
Pseudo Commentaire
Hors ligne remontees # Posté le 07/04/2012 à 13:45:57
Vive Symfony2 !
Avatar

Avis : Mitigé

Juste une petite question, normalement, on est en production sur le serveur mutualisé. Or ici, pour utiliser la console, il faut être en mode dev, ce qui n'est pas toujours très bien sur un mutualisé en prod. Étant donné que ce tutoriel s'adresse aux utilisateurs de mutualisé en particulier, il faudrait peut-être plus les faire installer la console aussi en mode prod, mais protéger la console avec les droits d'utilisateur.

Pensez à indiquer les messages qui vous ont aidé et à indiquer vos problèmes résolus ;)
XHTML 1.0/CSS <= 2 : IIIIIIIIII
PHP/MySQL : IIIIIIIIII
Javascript : IIIIIIIIII
HTML5/CSS3 : IIIIIIIIII



Citation
Je sais plus ce que j'écrivais ! :)
Qui que quoi dont où
Alors j'ai activé la prévisualisation automatique !
Citation : Moi
Eh oui

Et maintenant je suis tranquille !



Mon site : http://remontees.free.fr
 
Hors ligne thurin2000 # Posté le 26/04/2012 à 15:44:44
Jésus t'a créé
Avatar

Citation : Winzou
La commande ne fonctionne pas ? Il vous dit que PHP n'est pas un exécutable ? Vous avez dû oublier d'ajouter PHP dans votre variable PATH, on l'a fait au chapitre précédent, jetez y un oeil.


Quel chapitre précédent? Je ne vois rien du tout moi! Merci d'être plus clair

Psaumes 139 : 14 - 16 "Je te loue de ce que je suis une créature si merveilleuse. Tes œuvres sont admirables, Et mon âme le reconnaît bien. Mon corps n'était point caché devant toi, Lorsque j'ai été fait dans un lieu secret, Tissé dans les profondeurs de la terre. Quand je n'étais qu'une masse informe, tes yeux me voyaient; Et sur ton livre étaient tous inscrits Les jours qui m'étaient destinés, Avant qu'aucun d'eux existât."
 
Hors ligne winzou # Posté le 26/04/2012 à 23:02:12
lala
Avatar

Avis : Très bon Modérateurs

Ville : Singapour
Pays : Singapour
Études : Ecole Centrale de Lyon

En effet c'est 2 chapitres avant et pas 1. Enfin bon tu aurais pu trouver...

Un tutoriel pour débuter avec le framework Symfony2.
Chapitre en beta-test : Déployer son site Symfony2 en production, donnez vos avis !

Je recherche toujours quelqu'un capable de faire des icônes sympas pour les chapitres du tutoriel, contactez-moi, merci !
 
Connecté zéro_un # Posté le 27/04/2012 à 13:29:09
Avatar

un tutoriel clair Un grand merci

Un petit bout de code vaut mieux qu'un long discours ! ^^
 
Hors ligne tim974 # Posté le 03/05/2012 à 13:31:25
Avatar

Avis : Mitigé

L'idée est bonne, les grandes lignes sont là ... mais je trouve ça un peu laborieux.
 

Voir tous les commentaires