2. Plan
Recommandations de codage – PHP
Ne pas modifier Symfony
Gestion des actions
Routing SF
Dépendances
Refactoring
Fichiers
Gestion des plugins
Javascript - CSS
Débogage (+ Profiling)
Etapes d'un développement Réunion technique
01/15/10
2
3. Best pratices (once again !?)
Sont mouvantes
Sont empiriques (= subjectives)
Doivent nous servir et nous rassurer
Réunion technique
01/15/10
3
4. Recommandations de codage - PHP
Standard de codage PMSIpilot
Indenter avec 2 espaces
Ecrire les accolades sur des nouvelles lignes
Respecter les règles de nommage SF
Pour une classe, le nom de fichier se termine par .class.php
Pour une task, le nom de fichier se termine par Task.class.php
Si possible, ne pas fermer les tags PHP – Zend Programmer's
Reference Guide :
Ne pas l'inclure permet de se prémunir des problèmes liés à l'injection
accidentelle d'espaces blancs dans la sortie.
Réunion technique
01/15/10
4
5. Recommandations de codage - PHP
Standard de codage PMSIpilot
Préfixer les noms des classes maison par « pmsipilot »
Logguer les erreurs Log::add()
Déclencher des pmsipilotException
plutôt que des sfException
Utiliser les pre et post Execute sur les composants
Ne pas utiliser l'autoformatting de votre éditeur
Placer des @FIXME et @TODO (mode goret only)
Etc
cf. http://trac.symfony-
project.org/wiki/HowToContributeToSymfony#CodingStand
ards
Réunion technique
01/15/10
5
6. Recommandations de codage - PHP
Une variable doit être obligatoirement initialisée
Même si PHP sette les variables non initialisées à null
Réunion technique
01/15/10
6
7. Recommandations de codage - PHP
Préférer sprintf à l'opérateur '.' pour concaténer
Utiliser la méthode sprintf
Plus lisible
Permet le formatage (remplisseur, type, etc)
N'émet pas d'erreur en cas de variable inexistante
Au besoin, se servir de la syntaxe Heredoc
Réunion technique
01/15/10
7
8. Recommandations de codage - PHP
Rendre ses méthodes paramétrables
Pour éviter d'avoir des paramètres facultatifs nuisibles lors
des appels
Mettre, en dernier paramètre de fonction, un tableau
paramétrable à souhait
Réunion technique
01/15/10
8
9. Ne pas modifier Symfony
Même si la modification apporte un gain !
Buts :
obtenir impérativement le comportement attendu de SF
upgrader SF sans problèmes
Modifier le core SF
Etendre SF
surcharge
factories.yml
... Réunion technique
01/15/10
Voire ponctuellement Forker SF 9
10. Ne pas modifier Symfony
Etendre SF : exemple de pmsipilotUser
Mettre dans pmsipilotUser ce qui est commun à toutes les
applis
Coder dans myUser ce qui est spécifique à une application
Réunion technique
01/15/10
10
11. Gestion des actions
En début d'action, vérifier systématiquement les
paramètres obligatoires
Réunion technique
01/15/10
11
12. Gestion des actions
Faites des redirect au lieu de forward
Pour éviter de casser la navigation
Pour éviter le re-post du formulaire si rechargement de la
page
Réunion technique
01/15/10
http://www.symfony-project.org/forms/1_2/fr/02-Form-Validation 12
14. Routing SF
Nous utilisons peu les routes
Modules très rigides : à cause de références permanentes
aux noms des modules et des actions
URLs peu sexy
Réunion technique
01/15/10
14
15. Dépendances
Doivent nous obséder car
spécialisation forte du code
unit testing compromis
Au minimum, les référencer
Au mieux, les éviter ou les casser
Dans l'idéal, les gérer
injection de dépendances en PHP
http://fabien.potencier.org/article/15/symfony-service-container
Réunion technique
01/15/10
15
16. Dépendances - exemple
2010 : 1 appel à sfContext::getInstance() = 2 points boulet ?
utiliser pmsipilotContext en dehors d'un contexte SF devient
pénible
utiliser pmsipilotContext dans différents contextes SF devient
hasardeux
Réunion technique
01/15/10
16
17. Dépendances - exemple
Si inutile, éviter de passer des objets à un
constructeur ou à un setter
Réunion technique
01/15/10
17
18. Refactoring
Eviter les classes qui ne contiennent que des
méthodes statiques et fourre tout
Eviter les mélanges de concept
S'appuyer sur la POO
(OMG)
Réunion technique
01/15/10
18
19. Refactoring
Ranger les librairies aux bons endroits
plugins pmsipilotApp*Plugin
Conserver la généricité du code
Centraliser les modules, les surcharger
Différencier les traitements bas niveau relevant du core
Réunion technique
01/15/10
19
20. Refactoring
Yes we can
Jobs d'import
Gestion utilisateur
Composants PMSIpilot dans Visiopôle
Criteria
Gestion des menus
Page de détails des séjours
Message d'accueil
Gammes, licences
RAF
pmsipilot*Action
pmsipilot*User
Tranches d'ages Réunion technique
01/15/10
Indicateur de synthèse 20
21. Fichiers
Tout fichier créé doit être supprimé
Ecrivez dans /var/tmp
Utiliser pmsipilotUtils::myTempnam pour nommer les
fichiers (cf. http://fr.php.net/tempnam)
Eviter les accès au disque
Un sfFinder dans le bon répertoire
Vaut mieux
Qu'un sfFinder trop large qui resserre avec un « prune »
Réunion technique
01/15/10
21
22. Fichiers
Référencer le chemin vers un fichier à partir du
répertoire courant
Pour ne pas harcoder de path
Pour éviter par exemple des soucis lors de déplacement de
code
Ignorer les lignes vides
Réunion technique
01/15/10
22
23. Gestion des plugins
N'envisager de nouveaux plugins que s'ils ont des
schema.yml
Pour ne pas polluer
Possibilité de maintenir un schéma DBDesigner par plugin
Etre aware
De la version du plugin
Du placement et nommage des patchs
Des dépendances avec d'autres plugins
Du référencement des plugins (config/plugins.txt)
...
Réunion technique
01/15/10
23
24. Javascript - CSS
Tester en dev mais surtout tester en prod
En prod, compression JS (pmsipilotCombineFilter)
Tester sur FF mais surtout tester sur IE
IE foire sur des utilisations particulières de fonctions
jQuery
jQuery.map()
Statut des cases à cocher
etc
Réunion technique
01/15/10
24
25. Javascript - CSS
Eclater les inclusions de js/css par action et par
composant
Plutôt que tout mettre dans le view.yml de l'application
Utiliser la surcharge YAML (javascripts[-*] LOL)
Coder des objets javascript
Problématique des dépendances valable en JS
Réunion technique
01/15/10
25
27. Débogage ( + Profiling)
Un traitement pédale ?
vous incluez des url_for en boucle LOL ?
votre task SF se retape un autoloading pour le fun LOL ?
le logger Propel éclate votre RAM LOL ?
Suivre la web debug toolbar
Avant d'optimiser, MESURER
Eventuellement, se mettre en prod
Tout ce qui arrive en dev n'arrive pas forcément en prod (et vice versa)
"We should forget about small efficiencies, say about 97% of
the time: premature optimization is the root of all evil"
Réunion technique
01/15/10
Donald Knuth 27