Your SlideShare is downloading. ×
0
Une application
                            en deux heures
                               Avec Symfony




vendredi 13 nov...
Objectif


                 • Présenter symfony d’une façon
                        originale

                 • Faire un...
Qui suis-je?

            • Philippe Gamache
              •Expert en sécurité PHP
               chez Sensio Labs
       ...
Des
           questions?


                                  ?
                    N’attendez
                    pas à l...
L’application


                 • Blogue
                        • Commentaires
                        • URLs propres


...
symfony
                 • Cadre d’application WEB en PHP
                 • Basé sur :
                        • 10 ans d...
symfony

                 • Créer pour:
                   • Sites web professionnels
                   • Besoins complex...
Installer symfony

         http://www.symfony-project.org/installation
                 • Source
                 • Bac à...
Installation PEAR
      pear channel-discover pear.symfony-project.com
                            pear install symfony/sy...
Création du projet
              • Créer le répertoire du projet
                $ mkdir -p blogue
                $ cd bl...
Création du projet
              • Créer une application
                $ symfony generate:app /
                  --esca...
http://blogue.local/frontend_dev.php/


vendredi 13 novembre 2009                             12
Activation de sfDoctrine
                      // config/ProjectConfiguration.class.php
                      public funct...
La base de données
                 • Créer la base de données
                     $ mysqladmin -uroot -pmYsEcret /
     ...
Plugiciels
                 • Installer les plugiciels
             http://www.symfony-project.org/plugins/
              ...
Le modèle




vendredi 13 novembre 2009               16
Le schéma
     # config/doctrine/schema.yml
     actAs: [Timestampable]
     BlogPost:
       actAs:
         Timestampabl...
Données de tests
               # data/fixtures/fixtures.yml
               sfGuardUser:
                 philippeg:
     ...
Données de tests
          BlogPost:
            post_1:
              Author: philippeg
              title: Lorem ipsum ...
Données de tests
               BlogComment:
                 comment_1:
                   BlogPost: post_1
             ...
Création du code
                 • Utiliser le générateur de code
                  $ symfony doctrine:generate-crud /
  ...
Création du code
                 • Effacer les fichiers inutiles
                        • templates/_form.php
           ...
Création du code
                 • Modifier templates/indexSuccess.php
                       <?php foreach ($blog_post_li...
Création du code
                 • Modifier templates/showSuccess.php
                       <h2><?php echo $blog_post->ge...
Création du code
                 • Ajouter au templates/layout.php
                       <div id="header">
             ...
Création du code
                 • Modifier actions.class.php
                            public function executeIndex(sfW...
Création du code
                 • Modifier BlogPost.class.php
                            public function getContentSumma...
Ajouter les
                            commentaires
                 • Utiliser le générateur de code
                   ...
Ajouter les
                                       commentaires
                 • Modifier le code dans actions.class.php
...
Ajouter les
                                       commentaires
                 • Ajouter le code dans actions.class.php
...
Ajouter les
                                    commentaires
                 • Ajouter le code dans actions.class.php
   ...
Ajouter les
                                  commentaires
                 • Modifier templates/showSuccess.php
          ...
Ajouter les
                                  commentaires
                 • Modifier templates/showSuccess.php
          ...
Ajouter les
                                  commentaires
                 • Modifier templates/indexSuccess.php
         ...
Ajouter les
                                  commentaires
                 • Modifier templates/_form.php
                ...
Ajouter les
                                       commentaires
                 • Modifier BlogCommentForm.class.php
     ...
Création du Backend
              • Créer une application
                     $ symfony generate:app /
                  ...
Création du Backend
              • Créer les modules
                     $ symfony generate:admin /
                    ...
Création du Backend
              • Modifier routing.yml
                        sf_guard_signin:
                         ...
Création du Backend
                 • Ajouter au templates/layout.php
                       <div id="header">
          ...
Création du Backend
              • Modifier setting.yml
                        ...
                        all:
         ...
Création du Backend
              • Modifier post generator.yml
                        ...
                              c...
Création du Backend
              • Modifier comment generator.yml
                        ...
                            ...
Création du Backend
              • Modifier myUser.class.php
                        class myUser extends sfGuardSecurityU...
Pour aller plus loins

                 • Ajouter étiquettes (tags)
                 • Ajouter un mini-calendrier
        ...
Questions?

  philippe.gamache@symfony-project.com
                 info@ph-il.ca
       http://www.symfoy-project.org
   ...
vendredi 13 novembre 2009   47
Upcoming SlideShare
Loading in...5
×

Une application en deux heure - PHP Québec Janvier 2009

3,354

Published on

Faire une application complète (mais simple) en deux heures? Je dois être fou! Mais avec symfony, c'est possible!

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,354
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
300
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Une application en deux heure - PHP Québec Janvier 2009"

  1. 1. Une application en deux heures Avec Symfony vendredi 13 novembre 2009 1
  2. 2. Objectif • Présenter symfony d’une façon originale • Faire une application en une heure vendredi 13 novembre 2009 2
  3. 3. Qui suis-je? • Philippe Gamache •Expert en sécurité PHP chez Sensio Labs •Auteur du livre « Sécurité PHP 5 et MySQL » avec Damien Seguy, chez Eyrolles •http://www.phportail.net •http://lapageamelkor.org •naheulbeukauquebec.ca vendredi 13 novembre 2009 3
  4. 4. Des questions? ? N’attendez pas à la fin vendredi 13 novembre 2009 4
  5. 5. L’application • Blogue • Commentaires • URLs propres vendredi 13 novembre 2009 5
  6. 6. symfony • Cadre d’application WEB en PHP • Basé sur : • 10 ans d’expérience chez Sensio • D’autres logiciels libres existants • Licence MIT • Documentation est libre • Grande communauté vendredi 13 novembre 2009 6
  7. 7. symfony • Créer pour: • Sites web professionnels • Besoins complexes • Environnements exigeants • Développement rapide vendredi 13 novembre 2009 7
  8. 8. Installer symfony http://www.symfony-project.org/installation • Source • Bac à sable • Installation via PEAR • Installation via SVN • Installation Linux (Debian et SUSE) vendredi 13 novembre 2009 8
  9. 9. Installation PEAR pear channel-discover pear.symfony-project.com pear install symfony/symfony-1.2.1 vendredi 13 novembre 2009 9
  10. 10. Création du projet • Créer le répertoire du projet $ mkdir -p blogue $ cd blogue • Vérifier la version de symfony $ symfony -V • Créer un projet $ symfony generate:project blogue vendredi 13 novembre 2009 10
  11. 11. Création du projet • Créer une application $ symfony generate:app / --escaping-strategy=on / --csrf-secret=UniqueSecret / frontend • Ajuster votre serveur web vendredi 13 novembre 2009 11
  12. 12. http://blogue.local/frontend_dev.php/ vendredi 13 novembre 2009 12
  13. 13. Activation de sfDoctrine // config/ProjectConfiguration.class.php public function setup() { $this->enableAllPluginsExcept( array('sfPropelPlugin', 'sfCompat10Plugin')); } vendredi 13 novembre 2009 13
  14. 14. La base de données • Créer la base de données $ mysqladmin -uroot -pmYsEcret / create jobeet • Configurer le projet $ symfony configure:database / --name=doctrine / --class=sfDoctrineDatabase / "mysql:host=localhost;dbname=blogue" / root mYsEcret • Effacer la connexion de Propel vendredi 13 novembre 2009 14
  15. 15. Plugiciels • Installer les plugiciels http://www.symfony-project.org/plugins/ • sfDoctrineGuardPlugin $ symfony plugin:install / sfDoctrineGuardPlugin / --release=3.0.0 vendredi 13 novembre 2009 15
  16. 16. Le modèle vendredi 13 novembre 2009 16
  17. 17. Le schéma # config/doctrine/schema.yml actAs: [Timestampable] BlogPost: actAs: Timestampable: ~ Sluggable: fields: [title] BlogComment: unique: true columns: columns: blog_post_id: integer is_published: author_name: string(255) type: boolean author_email: string(255) default: false author_url: string(255) allow_comments: content: string(5000) type: boolean relations: default: true BlogPost: author_id: integer(4) local: blog_post_id title: string(255) foreign: id content: string(500000) type: one published_at: date foreignAlias: Comments relations: Author: class: sfGuardUser local: author_id foreign: id type: one vendredi 13 novembre 2009 17
  18. 18. Données de tests # data/fixtures/fixtures.yml sfGuardUser: philippeg: username: Philippe Gamache password: password is_super_admin: true sfGuardPermission: sgp_admin: name: admin description: Administrator permission sfGuardGroup: sgg_admin: name: admin description: Administrator group sfGuardGroupPermission: sggp_admin: sfGuardGroup: sgg_admin sfGuardPermission: sgp_admin sfGuardUserGroup: sgug_admin: sfGuardGroup: sgg_admin sfGuardUser: philippeg vendredi 13 novembre 2009 18
  19. 19. Données de tests BlogPost: post_1: Author: philippeg title: Lorem ipsum dolor sit amet content: | <p>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut...</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do...</p> is_published: true published_at: 09-01-07 post_2: Author: philippeg title: Ut enim ad minim veniam content: | <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...</p> <p>Duis aute irure dolor in reprehenderit in voluptate velit esse...</p> is_published: true published_at: 09-01-07 post_3: Author: philippeg title: Duis aute irure dolor in reprehenderit in voluptate content: | <p>Duis aute irure dolor in reprehenderit in voluptate velit esse...</p> <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...</p> is_published: true published_at: 09-01-07 ... vendredi 13 novembre 2009 19
  20. 20. Données de tests BlogComment: comment_1: BlogPost: post_1 author_name: lorem content: Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. comment_2: BlogPost: post_1 author_name: elit content: Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. comment_3: BlogPost: post_3 author_name: aute content: Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. comment_4: BlogPost: post_3 author_name: aute content: ESunt in culpa qui officia deserunt mollit anim id est laborum. vendredi 13 novembre 2009 20
  21. 21. Création du code • Utiliser le générateur de code $ symfony doctrine:generate-crud / --with-show frontend post BlogPost • Effacer les actions inutiles • executeNew() • executeEdit() • executeUpdate() • executeDelete() • processForm() vendredi 13 novembre 2009 21
  22. 22. Création du code • Effacer les fichiers inutiles • templates/_form.php • templates/editSuccess.php • templates/newSuccess.php • Effacer les liens vers les autres fonctions vendredi 13 novembre 2009 22
  23. 23. Création du code • Modifier templates/indexSuccess.php <?php foreach ($blog_post_list as $blog_post): ?> <h2><?php echo link_to($blog_post->gettitle(), '@post_show?slug=' . $blog_post->getslug()) ?></h2> <div>Par <?php echo $blog_post->getAuthor() ?> le <?php echo $blog_post->getpublished_at() ?></div> <p> <?php echo $blog_post->getContentSuccess() ?> </p> <p><?php echo link_to('Voir plus...', '@post_show?slug=' . $blog_post- >getslug()) ?></p> <br /><br /> <?php endforeach; ?> vendredi 13 novembre 2009 23
  24. 24. Création du code • Modifier templates/showSuccess.php <h2><?php echo $blog_post->gettitle() ?></h2> <div>Par <?php echo $blog_post->getAuthor() ?> le <?php echo $blog_post- >getpublished_at() ?></div> <p><?php echo nl2br($blog_post->getcontent()) ?></p> <hr /><br /><br /> <?php echo link_to('List', '@homepage') ?> vendredi 13 novembre 2009 24
  25. 25. Création du code • Ajouter au templates/layout.php <div id="header"> <h1><?php echo link_to('Mon Blogue', '@homepage') ?></h1> </div> <div id="content"> <?php echo $sf_data->getRaw('sf_content') ?> </div> <div id="footer"></div> • Ajouter web/css/blog.css • Modifier apps/frontend/config/view.yml vendredi 13 novembre 2009 25
  26. 26. Création du code • Modifier actions.class.php public function executeIndex(sfWebRequest $request) { $this->blog_post_list = Doctrine::getTable('BlogPost') ->createQuery('a') ->where('a.is_published = 1') ->execute(); } public function executeShow(sfWebRequest $request) { $this->blog_post = Doctrine::getTable('BlogPost') ->findOneBySlug($request->getParameter('slug')); $this->forward404Unless($this->blog_post); } vendredi 13 novembre 2009 26
  27. 27. Création du code • Modifier BlogPost.class.php public function getContentSummary() { $out = explode('<', nl2br(substr($this->getcontent(), 0, 500))); return $out[0] . '...'; } • Ajouter à routing.yml post_show: url: /:slug param: { module: post, action: show } vendredi 13 novembre 2009 27
  28. 28. Ajouter les commentaires • Utiliser le générateur de code $ symfony doctrine:generate-crud / frontend comment BlogComment • Copier le code dont vous aurez besoin vendredi 13 novembre 2009 28
  29. 29. Ajouter les commentaires • Modifier le code dans actions.class.php public function executeIndex(sfWebRequest $request) { $this->blog_post_list = Doctrine::getTable('BlogPost') ->createQuery('p') ->groupBy('p.published_at, p.id') ->where('p.is_published = 1') ->execute(); } public function executeShow(sfWebRequest $request) { $this->blog_post = Doctrine::getTable('BlogPost') ->findOneBySlug($request->getParameter('slug')); $this->forward404Unless($this->blog_post); $this->form = new BlogCommentForm(); } vendredi 13 novembre 2009 29
  30. 30. Ajouter les commentaires • Ajouter le code dans actions.class.php public function executeCreate(sfWebRequest $request) { $this->forward404Unless($request->isMethod('post')); $this->blog_post = Doctrine::getTable('BlogPost') ->findOneBySlug($request->getParameter('slug')); $this->forward404Unless($this->blog_post); $comment = new BlogComment(); $comment->setBlogPost($this->blog_post); $this->form = new BlogCommentForm($comment); $this->processForm($request, $this->form); $this->setTemplate('show'); } vendredi 13 novembre 2009 30
  31. 31. Ajouter les commentaires • Ajouter le code dans actions.class.php public function processForm(sfWebRequest $request, sfForm $form) { $form->bind($request->getParameter($form->getName())); if ($form->isValid()) { $blog_comment = $form->save(); $this->redirect('@post_show?slug=' . $request->getParameter('slug')); } } • Ajouter a routing.yml comment: url: /comment/:slug param: { module: post, action: create } vendredi 13 novembre 2009 31
  32. 32. Ajouter les commentaires • Modifier templates/showSuccess.php ... <p><?php echo nl2br($blog_post->getcontent()) ?></p> <?php if (count($blog_post->getComments())): ?> <ul id="comments"> <?php foreach ($blog_post->getComments() as $comment): ?> <li class="comments"> <br /> <div class="bold">Poster <?php echo $comment->getcreated_at() ?> par <?php echo $comment->getauthor_name() ?> le </div> <p> <?php echo $comment->getcontent() ?> </p> </li> <?php endforeach; ?> </ul> <?php endif ?> <br /> ... vendredi 13 novembre 2009 32
  33. 33. Ajouter les commentaires • Modifier templates/showSuccess.php ... <p class="bold">Ajouter votre commentaire</p> <br /> <?php include_partial('form', array('form' => $form, 'blog_post' => $blog_post)) ?> <hr /><br /><br /> <?php echo link_to('List', '@homepage') ?> vendredi 13 novembre 2009 33
  34. 34. Ajouter les commentaires • Modifier templates/indexSuccess.php ... <p> <?php echo $blog_post->getContentSuccess() ?> </p> <p>Commentaire (<?php echo count($blog_post->getComments()) ?>) : <?php echo link_to('Voir plus...', '@post_show?slug=' . $blog_post- >getslug()) ?></p> <br /><br /> <?php endforeach; ?> • Déplacer _form.php vendredi 13 novembre 2009 34
  35. 35. Ajouter les commentaires • Modifier templates/_form.php ... <form action="<?php echo url_for('@comment?slug=' . $blog_post->getSlug()) ?>" method="POST"> <?php if (!$form->getObject()->isNew()): ?> <input type="hidden" name="sf_method" value="PUT" /> <?php endif; ?> <table> ... • Garder que • author_name • author_email • author_url • content vendredi 13 novembre 2009 35
  36. 36. Ajouter les commentaires • Modifier BlogCommentForm.class.php public function configure() { unset( $this['created_at'], $this['updated_at'], $this['blog_post_id'] ); $this->validatorSchema['author_email'] = new sfValidatorEmail(array('required' => false)); $this->validatorSchema['author_url'] = new sfValidatorUrl(array('required' => false)); $this->widgetSchema->setLabels(array( 'author_email' => 'Votre courriel ', 'author_name' => 'Votre nom ', 'author_url' => 'Site Web ', 'content' => 'Commentaire ', )); } vendredi 13 novembre 2009 36
  37. 37. Création du Backend • Créer une application $ symfony generate:app / --escaping-strategy=on / --csrf-secret=UniqueSecret / backend vendredi 13 novembre 2009 37
  38. 38. Création du Backend • Créer les modules $ symfony generate:admin / --module=post backend BlogPost $ symfony generate:admin / --module=comment backend / BlogComment vendredi 13 novembre 2009 38
  39. 39. Création du Backend • Modifier routing.yml sf_guard_signin: url: /login param: { module: sfGuardAuth, action: signin } sf_guard_signout: url: /logout param: { module: sfGuardAuth, action: signout } sf_guard_password: url: /request_password param: { module: sfGuardAuth, action: password } # default rules homepage: url: / param: { module: post, action: index } vendredi 13 novembre 2009 39
  40. 40. Création du Backend • Ajouter au templates/layout.php <div id="header"> <h1><?php echo link_to('Mon Blogue', '@homepage') ?></h1> </div> <div id="menu"> <ul> <li><?php echo link_to('Poste', '@blog_post') ?></li> <li><?php echo link_to('Commentaire', '@blog_comment') ?></li> </ul> </div> <div id="content"> <?php echo $sf_data->getRaw('sf_content') ?> </div> <div id="footer"></div> • Modifier apps/frontend/config/view.yml vendredi 13 novembre 2009 40
  41. 41. Création du Backend • Modifier setting.yml ... all: .actions: login_module: sfGuardAuth login_action: signin secure_module: sfGuardAuth secure_action: secure .settings: enabled_modules: [default, sfGuardAuth] ... • Modifier setting.yml default: is_secure: on vendredi 13 novembre 2009 41
  42. 42. Création du Backend • Modifier post generator.yml ... config: actions: ~ fields: ~ list: title: Liste de message display: [is_published, author_id, =title, published_at] filter: display: [is_published] form: ~ edit: title: Modifier le message "%%title%%" display: [is_published, author_id, title, content, published_at] new: title: Nouveau message display: [is_published, author_id, title, content, published_at] vendredi 13 novembre 2009 42
  43. 43. Création du Backend • Modifier comment generator.yml ... config: actions: ~ _delete: ~ _list: ~ fields: ContentSummary: label: Commentaires list: object_actions: _delete: ~ actions: __: ~ title: Liste des commentaires display: [blog_post_id, =author_name, =ContentSummary] filter: display: [blog_post_id] form: ~ edit: ~ new: ~ vendredi 13 novembre 2009 43
  44. 44. Création du Backend • Modifier myUser.class.php class myUser extends sfGuardSecurityUser { } vendredi 13 novembre 2009 44
  45. 45. Pour aller plus loins • Ajouter étiquettes (tags) • Ajouter un mini-calendrier • Mettre les billets par mois • Ajouter recherche par date • Ajouter des flux de données (RSS, ATOM) via sfFeed2plugins vendredi 13 novembre 2009 45
  46. 46. Questions? philippe.gamache@symfony-project.com info@ph-il.ca http://www.symfoy-project.org http://www.phportail.net vendredi 13 novembre 2009 46
  47. 47. vendredi 13 novembre 2009 47
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×