À la découverte de Symfony 2

Dernièrement sur le blog de simple-it j'ai lu un très bon article traitant du Symfony live 2011. Ce dernier m'a donné l'envie découvrir ce framework, et tout particulièrement la dernière version qui ne tardera pas à sortir en version stable. Je vous propose dans ce billet, de vous initier a ce framework.

Téléchargement et installation

Pour télécharger Symfony, direction cette page. Dans la liste déroulante, choisissez la dernière version "Standard" en .tgz. Décompressez l'archive dans votre /var/www/. Allez à l'adresse suivante : http://localhost/Symfony/web/app_dev.php/. Vous devez avoir une erreur : en effet, il faut permettre à symfony d'écrire dans le dossier cache et de logs. Pour cela il faut entrer dans une console les commandes suivante :

  1. cd /var/www/Symfony/app
  2. sudo chown www-data logs cache

Le chown change l'utilisateur des dossiers logs et cache par celui standard d'Apache. Pour en savoir plus sur les droits sous Unix et Linux je vous conseil de lire ce tutoriel.

Si vous retournez sur le précédent lien, vous obtiendrez la page de démonstration de Symfony : le framework est fonctionnel.

Première apporche

Pour commencer quoi de mieux qu'un « Hello Word » ? Si vous êtes un habitué de Framework MVC vous avez très certainement déjà décortiqué l'url de la page de démonstration : http://localhost/Symfony/web/app_dev.php/demo/hello/World. On y distingue différentes parties. En bleu, on retrouve "la racine" du site. En production, il faudra définir à Apache le dossier web comme étant la racine. Ainsi, seul ce dossier sera public. En rouge, on retrouve le Front Contrôleur. Il en existe deux, app_dev.php servant aux environnements de développement et app.php servant à la production. Il existe plusieurs différences. La plus notable étant la présence ou non d'une barre de développement sur les pages du site. D'un point de vu plus technique, app_dev.php n'utilise pas de cache contrairement à app.php. En vert on retrouve le nom du contrôleur. L'action est quant à elle en violet. Enfin en orange on trouve un paramètre, ici le mot à afficher après "Hello".

Bundle

Les fonctionnalités d'un site web peuvent être séparée en bundle, par exemple le forum, le livre d'or, ou encore le blog d'un site web. Le contrôleur que nous avons utilisé demo fait parti du bundle DemoBundle. Nous allons créer le nôtre. Pour cela direction le dossier src de /var/www/Symfony. Dans de dossier on trouve un répertoire Acme qui contient un seul bundle DemoBundle. Créont le dossier de l'application : Tech dans src. Dans ce nouveau dossier, nous allons créer le répertoire MyBundle. Enfin dans ce dernier créons un fichier nommé TechMyBundle.php. Pour résumer, il faut créer un fichier src/Tech/MyBundle/TechMyBundle.php. Voici son code source :

  1. <?php
  2.  
  3. namespace Tech\MyBundle;
  4.  
  5. use Symfony\Component\HttpKernel\Bundle\Bundle;
  6.  
  7. class TechMyBundle extends Bundle
  8. {
  9. }
  10. // Notez qu'il ne faut JAMAIS fermer la balise "<?php" d'un fichier php

Il faut maintenant déclarer le bundle dans le fichier app/AppKernel.php et ajouter le dossier de notre application dans autoload.php.

  1. <?php
  2.  
  3. use Symfony\Component\HttpKernel\Kernel;
  4. use Symfony\Component\Config\Loader\LoaderInterface;
  5.  
  6. class AppKernel extends Kernel
  7. {
  8. public function registerBundles()
  9. {
  10. $bundles = array(
  11. new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
  12. new Symfony\Bundle\SecurityBundle\SecurityBundle(),
  13. new Symfony\Bundle\TwigBundle\TwigBundle(),
  14. new Symfony\Bundle\ZendBundle\ZendBundle(),
  15. new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
  16. new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
  17. new Symfony\Bundle\AsseticBundle\AsseticBundle(),
  18. new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
  19. new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
  20. new Acme\DemoBundle\AcmeDemoBundle(),
  21. new Tech\MyBundle\TechMyBundle(),
  22. );
  23.  
  24. if (in_array($this->getEnvironment(), array('dev', 'test'))) {
  25. $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
  26. $bundles[] = new Symfony\Bundle\WebConfiguratorBundle\SymfonyWebConfiguratorBundle();
  27. }
  28.  
  29. return $bundles;
  30. }
  31.  
  32. public function registerContainerConfiguration(LoaderInterface $loader)
  33. {
  34. $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
  35. }
  36. }
  1. <?php
  2.  
  3. use Symfony\Component\ClassLoader\UniversalClassLoader;
  4.  
  5. $loader = new UniversalClassLoader();
  6. $loader->registerNamespaces(array(
  7. 'Symfony' => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
  8. 'Sensio' => __DIR__.'/../vendor/bundles',
  9. 'JMS' => __DIR__.'/../vendor/bundles',
  10. 'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
  11. 'Doctrine\\DBAL' => __DIR__.'/../vendor/doctrine-dbal/lib',
  12. 'Doctrine' => __DIR__.'/../vendor/doctrine/lib',
  13. 'Zend\\Log' => __DIR__.'/../vendor/zend-log',
  14. 'Assetic' => __DIR__.'/../vendor/assetic/src',
  15. 'Acme' => __DIR__.'/../src',
  16. 'Tech' => __DIR__.'/../src',
  17. ));
  18. $loader->registerPrefixes(array(
  19. 'Twig_Extensions_' => __DIR__.'/../vendor/twig-extensions/lib',
  20. 'Twig_' => __DIR__.'/../vendor/twig/lib',
  21. 'Swift_' => __DIR__.'/../vendor/swiftmailer/lib/classes',
  22. ));
  23. $loader->register();
  24. $loader->registerPrefixFallback(array(
  25. __DIR__.'/../vendor/symfony/src/Symfony/Component/Locale/Resources/stubs',
  26. ));

Contrôleurs et actions

Notre contrôleur doit se trouver dans src/Tech/MyBundle/Controller/. Appelons-le MycontrollerController.php. Voici son contenu :

  1. <?php
  2.  
  3. namespace Tech\MyBundle\Controller;
  4.  
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7.  
  8. class MycontrollerController extends Controller
  9. {
  10. /**
  11.   * @extra:Route("/", name="_mycontroller")
  12.   * @extra:Template()
  13.   */
  14. public function indexAction()
  15. {
  16. return array();
  17. }
  18. }

Nous devons le déclarer dans le fichier app/config/routing.ylm. routing.ylm est au format YAML, C'est un format très simple à lire pour un humain, contrairement à l'XML ou au JSON.

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemo:Welcome:index }

_demo_secured:
    resource: "@AcmeDemo/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemo/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo

_mycontroller:
    resource: "@TechMy/Controller/MycontrollerController.php"
    type:     annotation
    prefix:   /mycontroller

Si vous allez visiter votre contrôleur http://localhost/Symfony/web/app_dev.php/mycontroller/, Symfony vous informera d'une erreur. En effet, aucun fichier de template n'est présent. Ajoutons-le !

Créons le fichier ''src/Tech/MyBundle/Resources/views/Mycontroller/index.html.twig.

Ajoutons le contenu suivant :

  1. {% extends "AcmeDemo::layout.html.twig" %}
  2.  
  3. {% block content %}
  4. Hello word !
  5. {% endblock %}

Le format des templates est celui du moteur de template twig. Pour plus de détail, rendez-vous sur ce tutoriel.

Nous avons réussi à réaliser notre première page !

Il est possible d'aller plus loin, par exemple, il est possible de générer du xml. Ajoutons une action helloInXml :

  1. <?php
  2.  
  3. namespace Tech\MyBundle\Controller;
  4.  
  5. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7.  
  8. class MycontrollerController extends Controller
  9. {
  10. /**
  11.   * @extra:Route("/", name="_mycontroller")
  12.   * @extra:Template()
  13.   */
  14. public function indexAction()
  15. {
  16. return array();
  17. }
  18.  
  19. /**
  20.   * @extra:Route("/helloInXml", defaults={"_format"="xml"}, name="_mycontroller_helloInXml")
  21.   * @extra:Template()
  22.   */
  23. public function helloInXmlAction()
  24. {
  25. return array();
  26. }
  27. }

Et créons le template helloXml.xml.twig :

  1. <say>Hello Word !</say>

Remarquez que les commentaires des actions ne sont pas optionnelles, ils sont interprétés par Symfony !

Le tutoriel se termine ici. J'espère qu'il sera utile. De mon coté je continue à l'étudier. La documentation de Symfony est très complète, je vous conseille d'y jeter un œil.

 
1. Le
10 juin
2011
08h39
par iPoulet

Moui, ça a l'air particulièrement verbeux en comparaison de ce que l'on peut trouver ailleurs. Quelle est ton expérience avec les frameworks autres que symfony (sans se limiter à ceux prévus pour PHP) ?

2. Le
10 juin
2011
19h58
par Maxence de Flotte

Oui, c'est assez verbeux. Cet article n'a pas pour but de pointer les avantages ou défauts de Symfony ! Il s'agit de le présenter, et surtout pour moi de synthétiser ce que j'ai appris.

Pour ce qui est de la critique, je n'utilise pas Symfony, alors je ne peux que difficilement en faire une, sinon qu'il me semble assez peu aisé de s'y mettre, à l'image de Magento. Mais une fois dedans (pour Magento), on s'y retrouve rapidement.

Donc pour les autres frameworks, évidement il y'a "Magento" (qui n'en ai pas réellement un) et qui est basé sur Zend, et puis des frameworks home made (par d'autres, ou par moi même), et PHP (car PHP est un framework). Dans d'autres langages, j'ai touché à Grails. Sinon, dans le web, je n'ai jamais touché de façon approfondi d'autres technos (telle que Python), pour la simple et bonne raison que je n'en ai jamais eu à l’occasion.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

À propos

Photographie

Maxence de Flotte

Développeur cœur PrestaShop

Passionné de nouvelles technologies

PHP, HTML5/CSS3, jQuery, Bootstrap, LESS CSS, ...

Voir mon CV

Mes projets