Download - SYMFONY
![Page 1: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/1.jpg)
SYMFONYSYMFONY2012 - 20132012 - 2013
22:03:0322:03:03 PWB L3 MioagePWB L3 Mioage 11
![Page 2: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/2.jpg)
PRINCIPE
Réaliser un site pour le cours de PWB
Représente la note de CC
Doit présenter un panel représentatif de vos compétences et vos acquis par rapport aux cours
Clients réels, valorisation de votre savoir faire – site en ligne en fonction du client 22
PWB L3 Miage
PWB L3 Miage
![Page 3: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/3.jpg)
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 anglaisDocumenté en anglais
![Page 4: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/4.jpg)
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/
![Page 5: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/5.jpg)
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
![Page 6: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/6.jpg)
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
![Page 7: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/7.jpg)
…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
![Page 8: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/8.jpg)
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
![Page 9: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/9.jpg)
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/
![Page 10: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/10.jpg)
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
![Page 11: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/11.jpg)
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
![Page 12: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/12.jpg)
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
![Page 13: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/13.jpg)
MVC WEB DE BASE
![Page 14: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/14.jpg)
MVC WEB SYMFONY
![Page 15: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/15.jpg)
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
![Page 16: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/16.jpg)
ANATOMIE D’UN PROJET
apps contient un répertoire par application (typiquement front et back)
batch scripts PHP exécutables en ligne de commandes ou via cron (ce répertoire n’existe plus en sf1.4)
Cache cache des configurations, actions, templates
config configuration générale de l’appli
data les données du projet, un schéma de base de données, des commandes SQL
doc Documentation de l’appli (ce répertoire n’existe plus en sf1.4)
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 l’Internet sont stockés ici
![Page 17: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/17.jpg)
ANATOMIE D’UNE APPLICATION myapp Contient tous les fichiers de l’application, nommé avec le
nom de l’application
config Un ensemble de fichier de configuration YAML concernant l’application.
i18n Les fichiers utilisés pour l’internationalisation de l’application (des fichiers de traduction en général).Si vous utilisez la base de données pour l’internationalisation, vous pouvez oublier ce dossier
lib Les classes et les librairies spécifiques à l’application
modules Tous les modules qui contiennent la logique de l’application
templates
Les templates (gabarits) globaux de l’application, 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.N.B. Les classes d’une application ne peuvent pas accéder aux méthodes ou 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 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 la manière de diviser votre projet en plusieurs applications, vous devrez garder à l’esprit que les liens hypertextes entre ces différentes applications garder à l’esprit que les liens hypertextes entre ces différentes applications devront être de forme absolue. devront être de forme absolue.
![Page 18: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/18.jpg)
ANATOMIE D’UN 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éé à l’initialisation du module
![Page 19: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/19.jpg)
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 Mémo complet :http://www.flickr.com/photos/deia/402335716/sizes/l/:http://www.flickr.com/photos/deia/402335716/sizes/l/
![Page 20: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/20.jpg)
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/
![Page 21: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/21.jpg)
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 projetCréer un répertoire pour le projetc:\> mkdir c:\dev\myprojectc:\> mkdir c:\dev\myproject
« Se mettre » dans ce répertoire« Se mettre » dans ce répertoirec:\> cd c:\dev\myprojectc:\> cd c:\dev\myproject
Créer un répertoire pour symfonyCréer un répertoire pour symfonymkdir libmkdir lib
mkdir lib/vendormkdir lib/vendor
![Page 22: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/22.jpg)
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/
![Page 23: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/23.jpg)
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!
![Page 24: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/24.jpg)
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
![Page 25: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/25.jpg)
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
![Page 26: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/26.jpg)
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>
![Page 27: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/27.jpg)
ÇA MARCHE!!
![Page 28: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/28.jpg)
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/inde
x
![Page 29: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/29.jpg)
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');
![Page 30: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/30.jpg)
…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'
![Page 31: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/31.jpg)
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 objectsfConfig::set('sf_foo', 'bar'); echo sfConfig::get('sf_foo');
![Page 32: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/32.jpg)
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!
![Page 33: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/33.jpg)
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
![Page 34: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/34.jpg)
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.
![Page 35: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/35.jpg)
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
![Page 36: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/36.jpg)
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!
![Page 37: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/37.jpg)
NOURRIR SES TEMPLATES• Symfony rend les attributs du contrôleur visibles dans l’espace de
nommage global du templateclass 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; ?>
![Page 38: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/38.jpg)
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
![Page 39: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/39.jpg)
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‘
) ?>
![Page 40: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/40.jpg)
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>
![Page 41: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/41.jpg)
RÉCUPÉRER LES VARIABLES DE LA REQUÊTE
• Au niveau du contrôleurclass 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
![Page 42: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/42.jpg)
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>
![Page 43: SYMFONY](https://reader035.vdocuments.fr/reader035/viewer/2022062808/568152f8550346895dc1142e/html5/thumbnails/43.jpg)
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