Symfony – get started

Download Report

Transcript Symfony – get started

Symfony
http://symfony-project.org
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
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/
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
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
…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
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
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/
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
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
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
MVC web de base
MVC web Symfony
Architecture type d’un blog
• Passer un blog PHP en MVC
•
http://www.symfony-project.org/gentle-introduction/1_4/en/02-ExploringSymfony-s-Code
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
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. 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.
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
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.ph
p
Un controleur par application et par
environnement
Mémo complet :http://www.flickr.com/photos/deia/402335716/sizes/l/
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/
installer symfony (1)
Créer un répertoire pour le projet
mkdir -p /dev/myproject
« Se mettre » dans ce répertoire
cd /dev/myproject
Créer un répertoire pour symfony
mkdir lib/vendor
Créer un répertoire pour le projet
c:\> mkdir c:\dev\myproject
« Se mettre » dans ce répertoire
c:\> cd c:\dev\myproject
Créer un répertoire pour symfony
mkdir lib
mkdir lib/vendor
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/
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!
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
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
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>
Ça marche!!
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
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');
…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'
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');
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!
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
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.
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
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!
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; ?>
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
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‘
)
?>
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>
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
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>
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
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.