1 / 43

Symfony

http://symfony-project.org. Symfony . Un projet français. 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur Documentation complète Sous licence MIT (BSD compatible avec GNU/GPL) Tutoriel Askeet pour symfony 1.0 Jobeet pour symfony 1.2

elda
Download Presentation

Symfony

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. http://symfony-project.org Symfony

  2. Un projet français • 1ère version octobre 2005 • Fabien Potencier PDG de sensio Lab développeur • Documentation complète • Sous licence MIT (BSD compatible avec GNU/GPL) • Tutoriel • Askeet pour symfony 1.0 • Jobeet pour symfony 1.2 • The more with symfony 1.3 & 1.4 Documenté en anglais

  3. Une communauté réactive • Forum réactif http://forum.symfony-project.org/ • Mise à dispo de cheatsheet exhaustives et conscises • De nombreux plugins • Multiple blogs consacrés à symfony • Offres d'emploi pour les symfonistes • http://symfonians.net/

  4. A propos de ce cours • Concerne symfony 1.2 à 1.4 • Ni symfony 1.0 • Ni symfony 2.0 • Basé sur «A Gentle Introduction to symfony» • http://www.symfony-project.org/gentle-introduction/1_4/en/ • Non abordé • Le cache, Tests unitaires, Test fonctionnels, Les mails

  5. Un framework … • Un framework améliore les conditions de développement • En automatisant certaines tâches récurrentes • En proposant une structure invitant à écrire du code « propre » et lisible • En implémentant des fonctionnalités complexes sous forme de composants • Structure MVC

  6. …En PHP conçu pour *amp • Écrit en PHP5 (utilisation du paradigme objet) • Utilisation des canaux PEAR pour • Installation /maintenance du framework • Installation /maintenance des plugins • BDD compatibles (via une ORM) • MySQL • PostgreSQL • Oracle • Microsoft SQL Server • … • Plateformes • Unix & unix-like • Windows • MacOSX

  7. Only the very best • Utilisation de la ligne de commande • Indépendant du SGBD • Utilisation simple • souplesse pour des cas plus complexes • Automatisation des parties du développement : on ne s’occupe que de ce qui sort de l’ordinaire • Code parlant et facile à lire

  8. couche d'abstraction & ORM • Abstraction de données • indépendance vis-à vis du SGBD • Géré par creole dans symfony 1.0 avec propel • Géré par l'extension PDO pour les ORM utilisées par symfony 1.2 • ORM • mapping objet/relationnel • Produits des objets permettant l'accès aux données tout en isolant la logique métier • Deux possibilités • propel : http://www.propelorm.org/ • doctrine : http://www.doctrine-project.org/

  9. Fonctionnalités intégrées • Internationalisation • Principe de templates • (manipulables par les infographistes) • Validateur de formulaire • Protection anti-XSS • Gestion de cache • Authentification et gestion de permissions • url rewriting • Système de plugins

  10. Outils & environnement • Les tests unitaires et fonctionnels facilitent la phase de développement • La barre d’outil de débuggage affiche toutes les informations nécessaires • La ligne de commande automatise • Les tests • Le déploiement • Les tâches d’administration (cache • Le développement • Maintenance de la BDD • Génération de code • modèles, formulaires, interface d’administration … • Les outils de logs fournissent des détails précis sur l’activité de l’appli

  11. Concepts de bases • Basé sur le paradigme objet • Soutenu par le modèle objet de PHP5 • L’Object-Relational Mapping (ORM) passerelle entre le modèle de base de données et les classes objet • Rapid Application Development (RAD) / agil programming • KISS (Keep It Simple, Stupid) • DRY (Don’t Repeat Yourself) • Refactoring • Réactivité quant aux évolutions du modèle • RTFM

  12. MVC web de base

  13. MVC web Symfony

  14. Architecture type d’un blog • Passer un blog PHP en MVC • http://www.symfony-project.org/gentle-introduction/1_4/en/02-Exploring-Symfony-s-Code

  15. Anatomie d’un projet

  16. Anatomie d’une application N.B. Les classes d’une application ne peuvent pas accéder aux méthodes ou attributs d’une tierce application d’un même projet. Lorsque vous déciderez de la manière de diviser votre projet en plusieurs applications, vous devrez garder à l’esprit que les liens hypertextes entre ces différentes applications devront être de forme absolue.

  17. Anatomie d’un module

  18. racine du serveur Mémo complet :http://www.flickr.com/photos/deia/402335716/sizes/l/

  19. environnement symfony • Pré requis • Une plateforme *amp • Choisir la version http://www.symfony-project.org/installation • Le chemin de PHP CLI doit être ajouté au path pour que la commande symfony fonctionne • Un éditeur de texte CORRECT! • Suggestion : http://www.pspad.com/fr/ • Ou mieux un IDE : http://netbeans.org/

  20. installer symfony (1) • Créer un répertoire pour le projetmkdir -p /dev/myproject • « Se mettre » dans ce répertoirecd /dev/myproject • Créer un répertoire pour symfonymkdir lib/vendor • Créer un répertoire pour le projetc:\> mkdir c:\dev\myproject • « Se mettre » dans ce répertoirec:\> cd c:\dev\myproject • Créer un répertoire pour symfony • mkdir lib • mkdir lib/vendor

  21. Installer symfony (2) • Soit en téléchargeant l’archive • Décompresser dans /dev/myproject/lib/vendor/symfony • Soit à partir du svn • Positionné « dans » le projet • $ svn propset svn:externals "symfony http://svn.symfony-project.com/trunk/" lib/vendor/

  22. Créer un projet • Positionné « dans » le répertoire du projet • $ php lib/vendor/symfony/data/bin/symfony generate:project myproject • Toutes les commandes symfony s’exécute dans le répertoire du projet!

  23. Créer une application • $ php symfony generate:app myapp • Un répertoire est créé • /dev/myproject/apps/myapp/ • Ce répertoire contient la strucutre de l’application • Deux fichiers sont également créés • /dev/myproject/index.php /dev/myproject/myapp_dev.php

  24. Côté serveur (apache) • C’est le dossier web qui est servi par apache • Un alias doit être créé pour rendre les feuilles de styles, images et javascripts du framework (installé dans lib/vendor) accessibles • mod_rewrite doit être activé • N’oubliez pas de recharger la conf du serveur (avec classe ;-) )apache2ctl graceful

  25. Virtual host apache typique pour projet symfony • <VirtualHost *:80> • ServerName myapp.example.com • DocumentRoot "/path_to_web_dir/myproject/web" • DirectoryIndex index.php • Alias /sf / /sf_symfony_data_dir/web/sf • <Directory "/sf_symfony_data_dir/web/sf"> • AllowOverride All • Allow from All • </Directory> • <Directory "/path_to_web_dir/myproject/web"> • AllowOverride All • Allow from All • </Directory> • </VirtualHost>

  26. Ça marche!!

  27. Création d’un module • $ symfony generate:module myapp mymodule • La structure est créée /dev/myproject/apps/myapp/modules/mymodule/actions/actions.class.php /dev/myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php Tester http://localhost/myapp_dev.php/mymodule/index

  28. Les conteneurs de paramètres … • Utilisés par beaucoup de classes symfony • Par exemple si $reponse est un objet de classe sfReponse $response->getParameter('foo'); $response->getParameterHolder()->get('foo'); $response->setParameter('foo', ‘bar'); $response->getParameterHolder()->set('foo', 'bar'); Valeur par défaut • $response->getParameter('foo', ‘bar');

  29. …supportent les espaces de nommage • $response->setParameter('foo', 'bar1'); • $response->setParameter('foo', 'bar2', 'my/name/space'); • echo $response->getParameter('foo'); • 'bar1' • echo $response->getParameter('foo', null, 'my/name/space'); • => 'bar2'

  30. Les constantes • Constantes PHP classiques très peu utilisées dans symfony • La classe sfConfig centralise la conf // Instead of PHP constants, define('SF_FOO', 'bar'); echo SF_FOO; // Symfony uses the sfConfig object sfConfig::set('sf_foo', 'bar'); echo sfConfig::get('sf_foo');

  31. Auto-chargement des classes • Plus besoin de <?php include 'classes/MyClass.php'; ?> • Pour faire un <?php $myObject = new MyClass(); ?> • Sans l’include la classe est recherchée dans l’ordre dans: • apps/myapp/module/lib/ • apps/myapp/lib/ • /lib/ • La première classe trouvée, est incluse automatiquement. • Vous n’avez jamais à inclure une classe dans symfony!

  32. Hello world en symfony • Prérequis • Une install de symfony • Un projet et une appli myapp créée au préalable • Etape1 Créer un module vide $ cd ~/myproject $ symfony generate:module myapp mymodule

  33. Fichiers Dossiers auto générés • créé 5 dossiers … • actions/ • config/ • lib/ • templates/ • validate/ • … et 3 fichiers • dans le dossier test/ pour les tests fonctionnelles • actions/actions.class.php, renvoie vers la page de félicitation du module par défaut. • templates/indexSuccess.php, est vide.

  34. Ajout d’une nouvelle action myAction • class mymoduleActions extends sfActions • { • public function executeMyAction() • { • } • } • Création d’un template templates/myActionSuccess.php contenant <p>Hello, world!</p> • Visible sur http://localhost/myapp.php/mymodule/myAction

  35. Pseudo langage de templates • Version PHP5 « pure » <?php   if ($test) { echo "<p>".time()."</p>"; }   ?> • Version template symfony « style » <?php if ($test): ?> <p><?php echo time(); ?></p> <?php endif; ?> • Valable pour if, foreach, while, etc … • Pas de echo de balise!

  36. Nourrir ses templates • Symfony rend les attributs du contrôleur visibles dans l’espace de nommage global du template class mymoduleActions extends sfActions { public function executeMyAction() { $today = getdate(); $this->hour = $today['hours']; } } • Va pouvoir s’utiliser dans un template comme suit <?php if ($hour >= 18): ?> <p> Or should I say good evening? It is already <?php echo $hour ?>. </p> <?php endif; ?>

  37. Les helpers • Les helpers sont des fonctions PHP appelées par les templates • Un helper génère du code HTML • Un helper est en général plus rapide à écrire que le code HTML qu’il produit • Symfony propose de nombreux helpers • Symfony permet d’écrire ses propres helpers

  38. Les helpers de liens • En PHP / XHTML <a href="/myapp_dev.php/mymodule/anotherAction?name=anonymous"> I never say my name </a> • En symfony <?php echo link_to( 'I never say my name', 'mymodule/anotherAction?name=anonymous‘ ) ?>

  39. Exemple de tableau d’options pour un helper • <?php echo link_to( • 'I never say my name', • 'mymodule/anAction?name=anonym', • array( • 'class' => 'special_link', • 'confirm' => 'Are you sure?', • 'absolute' => true • ) • ) ?> • Produit • <a class="special_link" • onclick="return confirm('Are you sure?');" • href="http://localhost/myapp.php/mymodule/anAction/name/anonym"> • I never say my name</a>

  40. Récupérer les variables de la requête • Au niveau du contrôleur class mymoduleActions extends sfActions { public function executeAnotherAction() { $this->name = $this->getRequestParameter('name'); //ou $this->name = $this->getRequest()->getParameter('name'); } } • Au niveau du template <p>Hello, <?php echo $sf_params->get('name') ?>!</p> • Plutôt que $_GET, $_POST ou $_REQUEST • Transparent pour l’url rewriting • Filtrage de code malicieux

  41. Autre exemples • <?php if ($sf_params->has('name')): ?> • <p>Hello, <?php echo $sf_params->get('name') ?>!</p> • <?php else: ?> • <p>Hello, John Doe!</p> • <?php endif; ?> • $this->hasRequestParameter('name') fonctionne également dans le contrôleur • Ce qui a été vu précedemment pour les conteneurs de paramètres s’applique <p>Hello, <?php echo $sf_params->get('name', 'John Doe') ?>!</p>

  42. Bien se conduire en Symfony • Nom de table, champs de table • ma_table, mon_attribut • Nom de classe • $maTable = new MaTable(); • Nom des getters, setters • echo $maTable->getMonAttribut(); • $maTable->setMonAttribut(‘foo’); • Nom de module associé à une table (objet) • maTable • Nom d’action • maTable/myAction dans l’url • executeMyAction() dans le contrôleur • Nom de template associé • myActionSuccess.php, myActionError.php • Camelize : passer de ma_table à maTable • On aère le code

  43. Recommandation symfony • In the code examples given in this book, you probably noticed that the opening and closing curly braces ({ and }) occupy one line each. This standard makes the code easier to read. • Among the other coding standards of the framework, indentation is always done by two blank spaces; tabs are not used. This is because tabs have a different space value according to the text editor you use, and because code with mixed tab and blank indentation is impossible to read. • Core and generated symfony PHP files do not end with the usual ?> closing tag. This is because it is not really needed, and because it can create problems in the output if you ever have blanks after this tag. • And if you really pay attention, you will see that a line never ends with a blank space in symfony. The reason, this time, is more prosaic: lines ending with blanks look ugly in Fabien's text editor.

More Related