Symfony - PowerPoint PPT Presentation

1 / 45
About This Presentation
Title:

Symfony

Description:

Symfony http://symfony-project.org Un projet fran ais 1 re version octobre 2005 Fabien Potencier PDG de sensio Lab d veloppeur Fran ois Zanonitto crit la ... – PowerPoint PPT presentation

Number of Views:303
Avg rating:3.0/5.0
Slides: 46
Provided by: Adm9169
Category:

less

Transcript and Presenter's Notes

Title: Symfony


1
Symfony
  • http//symfony-project.org

2
Un projet français
  • 1ère version octobre 2005
  • Fabien Potencier PDG de sensio Lab développeur
  • François Zanonitto écrit la documentation
  • Documentation complète
  • Sous licence MIT (BSD compatible avec GNU/GPL)
  • Tutoriel
  • Askeet pour symfony 1.0
  • Jobeet pour symfony 1.2
  • Calendrier de l'avent 2009 symfony 1.3 1.4

Documenté en anglais
3
Une communauté réactive
  • Forum réactif
  • Mise à dispo de cheatsheet exhaustives et
    conscises
  • De nombreux plugins
  • Multiple blogs consacrés à symfony
  • Offres d'emploi pour les symfonistes

4
A propos de ce cours
  • Concerne symfony 1.0
  • Non abordé
  • Le cache, Tests unitaires, Test fonctionnels

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 package
  • Structure MVC

6
En PHP conçu pour Xamp
  • Écrit en PHP5 lt
  • Utilisation des canaux PEAR pour
  • Installation /maintenance du framework
  • Installation /maintenance des plugins
  • BDD compatibles
  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • Plateformes
  • nix
  • Windows

7
Only the very best
  • Installation facile (via les canaux PEAR)
  • Indépendant du SGBD
  • Utilisation simple
  • souplesse pour des cas plus complexes
  • Automatisation des parties du développement on
    ne soccupe que de ce qui sort de lordinaire
  • 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
  • Géré par l'extension PDO dans 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//propel.phpdb.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
  • Support AJAX (pour symfony 1.0 uniquement)
  • Système de plugins

10
Outils environnement
  • Génération de code interface dadministration
    en un clic
  • Les tests unitaires et fonctionnels facilitent la
    phase de développement
  • La barre doutil de débuggage affiche toutes les
    informations nécessaires
  • La ligne de commande automatise le déploiement
  • Les outils de logs fournissent des détails précis
    sur lactivité de lappli

11
Concepts de bases
  • Basé sur le paradigme objet
  • Soutenu par le nouveau modèle objet de PHP5
  • LObject-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 (Dont Repeat Yourself)
  • Refactoring
  • Réactivité quant aux évolutions du modèle
  • RTFM

12
MVC web de base
13
MVC web Symfony
14
Architecture type dun blog
  • Passé un blog PHP en MVC
  • http//www.symfony-project.org/book/1_0/02-Explori
    ng-Symfony-s-Code

15
Anatomie dun projet
apps contient un répertoire par application (typiquement front et back)
batch scripts PHP exécutable en ligne de commandes ou via cron
Cache cache des configurations, actions, templates
config configuration générale de lappli
data les données du projet, un schéma de base de données, des commandes SQL
doc Documentation de lappli
lib toutes les classes et librairies partagées par toutes les applications
log fichiers de log symfony (par applications et environnement)
plugins les plugins utilisés par le projet
test contient les tests unitaires et fonctionnels
web la racine du serveur web. Tous les fichiers accessibles de lInternet sont stockés ici
16
Anatomie dune application
myapp Contient tous les fichiers de lapplication, nommé avec le nom de lapplication
config Un ensemble de fichier de configuration YAML concernant lapplication.
i18n Les fichiers utilisés pour linternationalisation de lapplication (des fichiers de traduction en général). Si vous utilisez la base de données pour linternationalisation, vous pouvez oublier ce dossier
lib Les classes et les librairies spécifiques à lapplication
modules Tous les modules qui contiennent la logique de lapplication
templates Les templates (gabarits) globaux de lapplication, partagés par tous les modules. Par défaut, il y a un fichier layout.php, dans lequel les templates du module seront insérés
N.B. Les classes dune application ne peuvent pas
accéder aux méthodes ou attributs dune tierce
application dun même projet. Lorsque vous
déciderez de la manière de diviser votre projet
en plusieurs applications, vous devrez garder à
lesprit que les liens hypertextes entre ces
différentes applications devront être de forme
absolue.
17
Anatomie dun module
mymodule Contient tous les fichiers du module, nommé avec le nom du module
actions Contient les actions du module dans actions.class.php et éventuellment des actions liés aux admin-generator dans components.class.php
config Peut contenir des fichiers de configuration locaux propres au module
lib Les classes et librairies spécifiques au module
templates Contient les templates et partial (morceau de template). Un template par défaut indexSuccess.php est créé à linitialisation du module
validate Dédié aux fichiers de configuration pour la validation des formulaires
18
racine du serveur
css Toutes les feuilles de styles (.css)
images Toutes les images (.gif, .jpg, .png) pour la mise en forme
js Tous les fichiers javascript (.js)
uploads Tous les fichiers uploadés par les utilisateurs
index.php Le controleur principal appelé par défaut (/)
myapp_dev.php Un controleur par application et par environnement
Mémo complet http//www.flickr.com/photos/deia/4
02335716/sizes/l/
19
Installation standard
  • Une plateforme amp
  • Une copie partagée du framework
  • Installation de la version courante pear install
    symfony/symfony-1.0.21
  • Solutions alternative
  • Sandbox
  • Repository SVN
  • Le chemin de PHP CLI doit être ajouté au path
    pour que la commande symfony fonctionne
  • la commande symfony en détail

20
Créer un projet symfony
  • Créer un répertoire pour le projet/path_to_web_di
    r/myproject
  •  Se mettre  dans ce répertoirecd
    /path_to_web_dir/myproject
  • Tapersymfony init-project myproject
  • La structure du projet symfony est créé
    automatiquementN.B. le répertoire apps est vide

21
Créer une application dans le projet
  •  Se mettre  dans ce répertoirecd
    /path_to_web_dir/myproject/
  • Tapersymfony init-app myapp
  • Un répertoire /path_to_web_dir/myproject/myapp/
    est créé
  • La strucutre dapplication est créé dans
    /path_to_web_dir/myproject/myapp/
  • Deux fichiers sont également créés dans
    /path_to_web_dir/myproject/web/
  • index.php
  • myapp_dev.php

22
Côté serveur (apache)
  • Cest 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é pans le répertoire PEAR) accessibles
  • mode_rewrite doit être activé
  • Noubliez pas de recharger la conf du serveur
    (avec classe -) )apache2ctl graceful
  • Tester myapp.example.com

23
Virtual host apache typique pour projet symfony
  • ltVirtualHost 80gt
  • ServerName myapp.example.com
  • DocumentRoot "/path_to_web_dir/myproject/web"
  • DirectoryIndex index.php
  • Alias /sf / /sf_symfony_data_dir/web/sf
  • ltDirectory "/sf_symfony_data_dir/web/sf"gt
  • AllowOverride All
  • Allow from All
  • lt/Directorygt
  • ltDirectory "/path_to_web_dir/myproject/web"gt
  • AllowOverride All
  • Allow from All
  • lt/Directorygt
  • lt/VirtualHostgt

24
Hébergement en mutualisé
  • Changer le répertoire web
  • Dans config/config.php ou dans chaque
    apps/myApp/config/config.php
  • sf_root_dir sfConfigget('sf_root_dir')
  • sfConfigadd(array(
  • 'sf_web_dir_name' gt sf_web_dir_name 'www',
  • 'sf_web_dir' gt sf_root_dir.DIRECTORY_SEPARATOR.
    sf_web_dir_name,
  • 'sf_upload_dir' gt sf_root_dir.DIRECTORY_SEPARATO
    R.sf_web_dir_name.DIRECTORY_SEPARATOR.sfConfigg
    et('sf_upload_dir_name'),
  • )
  • )  
  • Customiser le myproject/www/.htaccess

25
Ça marche!!
26
Création dun module
  •  Se mettre  dans ce répertoirecd
    /path_to_web_dir/myproject/
  • Tapersymfony init-module myapp mymodule
  • La structure est créée
  • myproject/apps/myapp/modules/mymodule/actions/acti
    ons.class.php
  • myproject/apps/myapp/modules/mymodule/templates/in
    dexSuccess.php
  • Tester http//localhost/myapp_dev.php/mymodule/ind
    ex

27
Les conteneurs de paramètres
  • Utilisés par beaucoup de classes symfony
  • Par exemple reponse un objet de classe sfReponse
  • response-gtgetParameterHolder()-gtset('foo',
    'bar')
  • ?response-gtsetParameter('foo', bar')
  • response-gtgetParameterHolder()-gtget('foo')
  • ?response-gtgetParameter('foo')
  • Valeur par défaut
  • response-gtgetParameter('foo', bar')

28
supportent les espaces de nommage
  • response-gtsetParameter('foo', 'bar1')
  • response-gtsetParameter('foo', 'bar2',
    'my/name/space')
  • echo response-gtgetParameter('foo')
  • gt 'bar1'
  • echo response-gtgetParameter('foo', null,
    'my/name/space')
  • gt 'bar2'

29
Les constantes
  • 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
  • sfConfigset('sf_foo', 'bar')
  • echo sfConfigget('sf_foo')

30
Auto-chargement des classes
  • Plus besoin de
  • lt?php include 'classes/MyClass.php' ?gt
  • Pour faire un
  • lt?php myObject new MyClass() ?gt
  • recherche la définition de MyClass lib/.php
  • apps/myapp/module/lib/, apps/myapp/lib/, /lib/
  • Si elle est trouvée, elle est incluse
    automatiquement.
  • Vous navez jamais à inclure une classe dans
    symfony!

31
Hello world en symfony
  • Prérequis
  • Une install de symfony
  • Un projet et une appli myapp créée au préalable
  • Créer un module vide
  • gt cd /myproject
  • gt symfony init-module myapp mymodule

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

33
Contenu du contrôleur
  • class mymoduleActions extends sfActions
  • public function executeIndex()
  • this-gtforward('default', 'module')
  • Le code par défaut reroute laction index vers
    laction default du module module
  • Appel par convention de nommage le template
    templates/indexSuccess.php si laction nest pas
    reroutée
  • Visible sur
  • http//localhost/myapp_dev.php/mymodule/index
  • http//localhost/myapp_dev.php/mymodule/

34
Ajout de myAction
  • class mymoduleActions extends sfActions
  • public function executeMyAction()
  • Création dun template templates/myActionSuccess.p
    hp contenant
  • ltpgtHello, world!lt/pgt
  • Visible sur http//localhost/myapp.php/mymodule/my
    Action

35
Pseudo langage de templates
  • Version PHP5  pure 
  • lt?php  
  • if (test)
  • echo "ltpgt".time()."lt/pgt"
  •  
  • ?gt
  • Version template symfony  style 
  • lt?php if (test) ?gt
  • ltpgtlt?php echo time() ?gtlt/pgt
  • lt?php endif ?gt
  • Valable pour if, foreach, while, etc
  • Pas de echo de balise!

36
Nourrir ses templates
  • Symfony rend les attributs du contrôleur visible
    dans lespace de nommage global du template
  • class mymoduleActions extends sfActions
  • public function executeMyAction()
  • today getdate()
  • this-gthour today'hours'
  • Va pouvoir sutiliser dans un template comme suit
  • lt?php if (hour gt 18) ?gt
  • ltpgt
  • Or should I say good evening?
  • It is already lt?php echo hour ?gt.
  • lt/pgt
  • lt?php endif ?gt

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 quil produit
  • Symfony propose de nombreux helpers
  • Symfony permet décrire ses propres helpers

38
Le cas des formulaires en PHP
  • ltform method"post" action"/myapp.php/mymodule/an
    otherAction"gt
  • ltlabel for"name"gtWhat is your name?lt/labelgt
  • ltinput type"text" name"name" id"name"
    value"" /gt
  • ltinput type"submit" value"Ok" /gt
  • lt/formgt

39
Avec les helpers symfony
  • lt?php echo form_tag('mymodule/anotherAction') ?gt
  • lt?php echo label_for('name', 'What is your
    name?') ?gt
  • lt?php echo input_tag('name') ?gt
  • lt?php echo submit_tag('Ok') ?gt
  • lt/formgt
  • Meilleur clareté du code, plus rapide, plus
    concis
  • Customisable via des tableaux doptions

40
Les helpers de liens
  • En PHP / XHTML
  • lta href"/myapp_dev.php/mymodule/anotherAction?nam
    eanonymous"gt
  • I never say my name
  • lt/agt
  • En symfony
  • lt?php
  • echo link_to(
  • 'I never say my name',
  • 'mymodule/anotherAction?nameanonymous
  • )
  • ?gt

41
Exemple de tableau doptions pour un helper
  • lt?php echo link_to(
  • 'I never say my name',
  • 'mymodule/anotherAction?nameanonymous',
  • array(
  • 'class' gt 'special_link',
  • 'confirm' gt 'Are you sure?',
  • 'absolute' gt true
  • )
  • ) ?gt
  • lt?php echo link_to(
  • 'I never say my name',
  • 'mymodule/anotherAction?nameanonymous',
  • 'classspecial_link confirmAre you sure?
    absolutetrue
  • ) ?gt
  • lta class"special_link" onclick"return
    confirm('Are you sure?')" href"http//localhost/
    myapp.php/mymodule/anotherAction/name/anonymous"gt
  • I never say my namelt/agt

42
Récupérer les variables de la requête
  • Au niveau du contrôleur
  • class mymoduleActions extends sfActions
  • public function executeAnotherAction()
  • this-gtname this-gtgetRequestParameter('name')
  • Au niveau du template
  • ltpgtHello, lt?php echo sf_params-gtget('name')
    ?gt!lt/pgt
  • Plutôt que _GET, _POST ou _REQUEST
  • Transparent pour lurl rewriting
  • Filtrage de code malicieux

43
Autre exemples
  • lt?php if (sf_params-gthas('name')) ?gt
  • ltpgtHello, lt?php echo sf_params-gtget('name')
    ?gt!lt/pgt
  • lt?php else ?gt
  • ltpgtHello, John Doe!lt/pgt
  • lt?php endif ?gt
  • this-gthasRequestParameter('name') fonctionne
    également dans le contrôleur
  • Ce qui a été vu précedemment pour les conteneurs
    de paramètres sapplique
  • ltpgtHello, lt?php echo sf_params-gtget('name',
    'John Doe') ?gt!lt/pgt

44
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-gtgetMonAttribut()
  • maTable-gtsetMonAttribut(foo)
  • Nom de module associé à une table (objet)
  • maTable
  • Nom daction
  • maTable/myAction dans lurl
  • executeMyAction() dans le contrôleur
  • Nom de template associé
  • myActionSuccess.php, myActionError.php
  • Camelize passer de ma_table à maTable
  • On aère le code

45
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 ?gt 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.
Write a Comment
User Comments (0)
About PowerShow.com