Vous êtes sur la page 1sur 59

es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs

Marc Hugon, Gilles Taupenas


es bonnes pruLIques du dveIoppemenL symIony en o
poInLs cIs
Marc Hugon, Gilles Taupenas
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Enjeux
Lexistant PHP4
Les outils actuels
PHP5
Symfony 1.2 avec Propel / Doctrine
Opportunit pour les applicatifs
Dveloppement rapide
Prennit
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
PHP4
Fin de vie : enterr depuis le 8/08/08
Code essentiellement procdural
Support objet pauvre
Pas de dynamique pour faire du dveloppement
professionnel
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
PHP5 seul
Bon support objet
Hritage
Introspection
Systme dinterface
Outils pratiques
SPL : Autoload,
Les bons projets full PHP5 existent mais ils
cotent cher maintenir : ils embarquent leur
propre formalisme
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
PHP5 / symfony
Formalisme trs prsent
Un projet symfony quelconque a une arborescence de base
Trop contraignant ?
Symfony peut tre paramtr pour fixer une logique particulire et
ncessaire
En gnral, cest le code existant qui contraint tordre symfony
Outils
Ils sont dans symfony car ils constituent des fonctionnalits
globalement ncessaires aux applications web
Dfinissent un cosystme :
Ils communiquent entre eux
Ils sont tests pour bien fonctionner seuls et entre-eux
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Dveloppement rapide
La prsentation est l pour montrer que les
fonctionnalits permettent
De gagner du temps en dveloppement, en intgration
et en tests
Et surtout pas au dtriment de la qualit
Ne pas crer du code peu ou pas maintenable
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC
Modle Vue - Contrleur
Cr en 1979
Permet un bon dcoupage macroscopique entre
les 3 grandes entits dune application
Modle : constitue la logique mtier effectuant le
traitement des donnes
Vue : gre les interactions avec lutilisateur
Le contrleur : indispensable mais doit rester lger
Contrle les donnes utilisateur
Coordonne les opration de la vue et du modle
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Pourquoi MVC?
Dcoupage de lapplication
Rpartition du travail des intervenants
Adaptable toute application !
Importance primordiale
Cas de non-respect du dcoupage MVC est
lerreur majeure rencontre en audit
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Avantages du respect de MVC
Pouvoir passer facilement
dun client ligne de commandes un client
graphique / web
Dun client navigateur web un service web
(passage en flux business XML/SOAP)
Adaptation aux capacits du client web
Si Flash prsent : choisir flash
Sinon : si javascript prsent : choisir javascript
Sinon : choisir version HTML sans javascript
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
MVC
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC : le respecter
Comment tre sr de respecter le MVC?
Se poser la question de lemplacement des parties du
code
Contrle du code rgulier
Refactoriser
Garder propre chez soi est une rigueur de tous les
instants
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC : Taille du contrleur
Que fait le contrleur ?
Met en relation le modle et la vue
Gre les vnements de lutilisateur
Ce que ne fait pas le contrleur
Il ne connat pas les rgles mtiers
Il nest pas intelligent
Le code PHP dune mthode du contrleur
(executeXXX), cest 10 lignes maximum!
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC : Bien utiliser les composants
Composants (component)
Il sagit de reproduire un schma MVC propre cloisonn
un besoin rutilisable
Un composant nest pas cr directement, on cre
dabord un partial
Si ce partial est rutilis et quil doit contenir du code
PHP, alors on peut le transformer en component
Refactoring is a key point (and KISS)
Faire un partial si cest suffisant
Le transformer en composant plus tard
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC : Bien utiliser les helpers
Helpers
Standard : mise en forme facile de HTML
<?php use_helper(ProjectTags');?>
<?php echo clickable_image($user->getAvatar(),
@profile_info?.$user->getId()) ?>
Classes Helpers : permettre de factoriser une logique de
pivot pour
Rcuprer un format standard provenant du modle
Adapter ces donnes au format vue
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
MVC : PHP dans les templates
Il en faut le moins possible !
Template = Vue = HTML
Eviter
<?php echo <p>.$title.</p> ?>
Prfrer
<p><?php echo $title ?></p>
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Bases de donnes
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Bases de donnes : utiliser un ORM
Choisir Propel ou Doctrine
Saffranchir de la base de donne cible
Travailler sur des bases de donnes diffrentes selon
lenvironnement
Permettre de faire voluer le modle sans casse
Abstraire en objet les manipulations en base de
donnes
Surcharge
Permettre de changer la structure et le comportement
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM : pas doutil propritaire
Deux choix existants (Doctrine, Propel)
Utiliser un ORM propritaire
Rinventer la roue
Maintenance prendre en charge
Documentation crer
Transfert de comptence assurer
Pour des besoins spcifiques, tendre lORM
standard choisi
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM : requtes SQL
Ne doivent pas exister dans le code
Si elles existent (mais elles nexistent pas), elles
ne sont ni dans la Vue ni dans le Contrleur
Si elles existent (mais elles nexistent pas), cest
pour utiliser des mthodes spcifiques la base
de donnes cible non gres par lORM
Procdures stockes
Donnes de golocalisation dans PostgreSQL
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM : fonctions comportementales
Existent en Propel et Doctrine
Permettent de
donner un comportement
hors systme dhritage (=nature)
Exemples : versioning, liste arborescente, tag
Mais point trop nen faut : bnfice ne doit pas dpasser le
cot de la maintenance dentrelacement des cas limites
Trop de comportements sur une mme classe
Risque de cas limites
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM : gestion unifie du schma
Rfrentiel unique
Niveau 1 : schma unique
YML ou XML
YML plus lisible humainement
Mais XML facile tester valider
But
Un seul fichier important pour construction des classes de base
du modle
Maintenir jour ce schma et ses donnes de base : facile
installer
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM gestion unifie du schma
Rfrentiel unique toujours !
Niveau 2 : schma de la base modlis
Outil : DBDesigner, MySQLWorkbench,
On versionne ce fichier et non plus le schma YML ou
XML
Il est regnr pour DBDesigner4 grce
sfDbDesignerPlugin pour Doctrine
sfDb4ToPropelPlugin pour Propel
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
ORM : maintenances des bases
SQL seul pour faire voluer une base en
production?
Et si plusieurs instances voluent diffremment?
Fonctionnalits de migration
Comment ?
Propel : sfPropelMigrationsLightPlugin
Doctrine : de base
Intelligence : gestion de metadonnes : numro de
version
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Maintenance
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : lisibilit du code (1/5)
(Se re-)trouver facilement dans un projet
Acteurs : dveloppeurs, intgrateurs
Rendre lisible => homogniser
Standards de codage
PHP : OOP, syntaxe alternative
Ct Symfony :
Arborescence : elle qualifie ce quelle contient
Outils :
OOP, autoloading : trouver les classes, celles drives
Templating
Limite : attention au critre de dispersion
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : lisibilit du code (2/5)
Le code HTML ne peut se trouver que dans des
templates
Aucune mthode ne doit contenir par exemple
function forbiddenMethod($value = 0)
{
$content = <p>The value is ;
$content .= ($value > 0)? more than 0 : exactly 0;
$content .= </p>;
return $content;
}
Ractions ?
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : lisibilit du code (3/5)
Une norme unique doit tre utilise dans le code
PHP
Rgles dcritures (indentation, syntaxe des variables,
langue utilise)
Documentation, enttes
Rgles de retour la ligne
function myFunction($var)
{
if ($test)
{
//do something
}
}
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : lisibilit du code (4/5)
Syntaxe classique
<?php foreach ($cars as $car) {?>
<? php echo $car->getModel(); ?>
<?php if ($car->hasTurbo()) { ?>
(turbo)
<?php }} ?>
Syntaxe alternative
<?php foreach ($cars as $car) ?>
<? php echo $car->getModel(); ?>
<?php if ($car->hasTurbo()): ?>
(turbo)
<?php endif;?>
<?php endforeach; ?>
Les templates doivent respecter les standards
dintgration
Ils peuvent tre utiliss par les intgrateurs
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : lisibilit du code (5/5)
Penser smantique mais comment ?
XHTML seulement ? pour les intgrateurs !
Symfony ? Seulement pour les dveloppeurs !
Et les intgrateurs arrivent faire du symfony ?
Symfony permet daller plus loin avec : les partials, les
composants
Plus de smantique => maintenance accrue
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Standards de code : rpertoires
Pour les librairies projet, utiliser le rpertoire
lib , viter le rpertoire apps/xxx/modules/yyy/lib
Pour les libraires externes, utiliser le rpertoire
lib/vendor
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : tests (1/2)
Pendant la phase de production, crire en priorit
des tests unitaires
$t = new lime_test(3, new lime_output_color());
$t->is(Jobeet::slugify('Sensio'), 'sensio');
$t->is(Jobeet::slugify('sensio labs'), 'sensio-labs');
$t->is(Jobeet::slugify('paris,france'), 'paris-france');
Un test scrit le plus tt possible
Ne pas viser une couverture complte de
lapplication
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : tests (2/2)
A la fin de la phase de dveloppement, crire des
tests fonctionnels
$browser->
get('/category/index')->
with('response')->
begin()->
isStatusCode(200)->
checkElement('body', '!/This is a temporary page/')->
end() ;
Maintenir les tests
Lancer les tests chaque commit
Corriger immdiatement les tests qui chouent
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : utiliser symfony
Il ne faut pas bypasser le framework, ni le refaire
Pas de $_SESSION, utilisez sfUser
Pas de $_SERVER, $_POST, $_GET, utilisez
sfRequest
Pas de variables globales
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : code Symfony
Le code du framework ne doit jamais tre modifi
Mais il peut tre surcharg !
Conseil : systmatiquement utiliser symfony en
SVN:externals pour
Symfony
Plugins
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : fixtures
Avoir des jeux de donnes permet dinstaller
facilement lapplication sur un serveur de
dveloppement sans contrainte forte
Il faut donc avoir des fixtures pour assurer le
fonctionnement partir dun environnement vierge
Crer des jeux de donnes pour chaque nouvelle
fonctionnalit
Maintenir les jeux de donnes de test chaque
volution
Utiliser ces jeux de donnes dans les tests
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : utiliser le routing (1/3)
Ne JAMAIS utiliser dURLs internes en dur
Utiliser le routing (module/action)
Prfrer les routes nommes (@maroute)
Permet de changer
DURL : pour diffuser des URL lisibles adaptables sans changer
la logique
DURI : afin de changer une action de module pour un
refactoring
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : utiliser le routing (2/3)
Routing propre : faire des routes nommes
Permet de changer les URL
Maintenance interne aise :
dplacer du code de module
URL
contenu/editorial-du-10-juin
Routing
URI
Module : article
Action : show
Paramtres:
Titre = editorial-du-10-juin
@article
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : utiliser le routing (3/3)
Et du code vers lextrieur ?
<?php echo link_to(@article?title=editorial-du-10-
juin) ?>
Devient bien:
contenu/editorial-du-10-juin
Stable aux changements en bidirectionnel !
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : environnements
Le minimum est davoir trois environnements
Dveloppement
Production
Test
Si le cache est utilis, le minimum est quatre
environnements
Dveloppement
Staging
Production
Test
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : dploiement
Si besoins simples
Utiliser les outils de dploiement proposs par Symfony
Rsync, pas de FTP
Supprimer les contrleurs de dveloppement
Utiliser la ligne de commande
Utiliser les tche symfony de dploiement
Permet de mettre jour un environnement
Besoin de plus complexe ? Write your own
Importance de
app:enable/disable
Ne plus faire de FTP
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Maintenance : de lexplicite !
Prfrer un mode explicite
Actions
Pre/post Execute() viter : prfrer un appel direct
mthode protge de la classe dactions
Comportements du modle
Permet un comportement transversal hors hritage
Les objets perdent beaucoup de leur caractre
prdictible
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Performances
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Performances : acclrateur PHP
Le parsing des fichiers PHP est coteux
Installer un acclrateur PHP = gain de
performance serveur
Xcache (http://xcache.lighttpd.net/)
APC (http://php.net/apc)
Peut sinstaller sans contrainte sur un
environnement de dveloppement
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Performances : debug tools
Que regarder pour vrifier les performances de
lapplication ?
Empreinte mmoire (28223.3KB) : peu pertinent
Vitesse mesure (5895ms) : peu pertinent
Nombre de requtes : peu pertinent
La variation et le dtail des requtes sont
importantes
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Performances : debug tools
Bon rglage des niveaux de log par
environnement permet daller jusquau dtail de la
web debug toolbar
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Performances : cache
Objet
Si le rsultat dun calcul / appel en lui-mme est
important
HTML
Sil est pertinent davoir des versions prpares de
pages / morceaux de pages
Composant, template avec/sans layout
Supercache : ncessite authentification ?
Ruser : PHP peut rester, Javascript peut compenser
Taille du cache
Bien choisir son identifiant de cache
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Performances : cache
- Connatre
- son niveau dexigence
- Quand optimiser dans le cycle de dveloppement
- Attention linvalidation
Choix
Local
Partag
Spcificits prendre en compte suivant le type choisi
Ecrire du memcache / fichier
Invalider du memcache / fichier
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Dautres bonnes pratiques
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Gnral : encodage
Conseill : UTF-8
Seul format permettant dimplmenter le multilanguisme
Le plus standard pour mettre en place et utiliser des API
externes
Dans tous les cas : sassurer que lencodage est le
mme tous les niveaux :
Fichiers sources
Base de donnes
Encodage HTML
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Internationalisation
Ct templates
Bon dcoupage
Pratique courante chez Sensio : intgrer le helper
i18n sur le vocable prsent dans les templates
Surcut lger de dveloppement
Utiliser le helper format_number_choice()
Les termes doivent rester ct vue
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Internationalisation
Ct contenu utilisateur adapter (stock en base)
Attention aux jointures
Attention au comportement avec les behaviors
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Scurit
Utilisation directe de $_GET, $_POST?
Dsactiver lchappement symfony :
Localement :
$obj->getXXX(ESC_RAW)
$obj->getRawValue()
Globalement :
Escaping_strategy : off
Attaques trs aises : CSRF, XSS
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Pratique : dvelopper en plugins
Ne pas hsiter utiliser des plugins spcifiques
lapplication
Facilite lintervention de plusieurs dveloppeurs
simultanment
Facilite la rutilisation entre plusieurs projets, mais
ce nest pas un objectif en soi
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Pratique : plugins externes
Privilgier les plugins existants quand cest
possible :
Inutile de rcrire ce qui existe dj
Sassurer de la qualit du plugin
Ou dire
Indicateur de nombre dutilisation sur le site symfony-
project.org
Lire le code
Ne pas faire dexport sur le trunk
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Pratique : versioning
Le choix vous appartient (SVN, CVS, GIT)
Avantages
Simplifie le travail collaboratif
Historique
Retour arrire possible
Bonnes pratiques
Commenter tout modification
Un commit quotidien ?
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
SVN
SVN
Ignore
Externals : installation conseille de symfony
Taguer les versions
Dployes
En prod
En preprod
Pour le suivi et la maintenance des versions
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Pratique : Gestion des droits daccs
Ne pas confondre credential (droit) et un profil
utilisateur
Credential : connotation minimaliste, utiliser pour
des cas simples (un front office avec une zone
rserve aux utilisateurs authentifis)
Profil utilisateur : comportements diffrents de
lapplication selon des droits
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Une dernire, trs importante
Ne pas faire faire aux applications autre chose que
de lapplicatif !
Pas darchitecture physique !
Pas de synchronisation multi-points

Stop !
es bonnes pruLIques du dveIoppemenL symIony en o poInLs cIs
Marc Hugon, Gilles Taupenas
Les bonnes pratiques
Merci et.
Questions ?