45
Symfony http://symfony- project.org

Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Embed Size (px)

Citation preview

Page 1: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Symfony

http://symfony-project.org

Page 2: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 3: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 4: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

A propos de ce cours

• Concerne symfony 1.0

• Non abordé– Le cache, Tests unitaires, Test fonctionnels

Page 5: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 6: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

…En PHP conçu pour Xamp

• Écrit en PHP5 =<• Utilisation des canaux PEAR pour

– Installation /maintenance du framework– Installation /maintenance des plugins

• BDD compatibles– MySQL– PostgreSQL– Oracle – Microsoft SQL Server

• Plateformes– *nix– Windows

Page 7: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 s’occupe que de ce qui sort de l’ordinaire

• Code parlant et facile à lire

Page 8: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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/

Page 9: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 10: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Outils & environnement

• Génération de code : interface d’administration en un clic

• 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 le déploiement

• Les outils de logs fournissent des détails précis sur l’activité de l’appli

Page 11: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Concepts de bases

• Basé sur le paradigme objet • Soutenu par le nouveau 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 12: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

MVC web de base

Page 13: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

MVC web Symfony

Page 14: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Architecture type d’un blog

• Passé un blog PHP en MVC• http://www.symfony-project.org/book/1_0/02-Exploring-Symfony-s-Code

Page 15: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Anatomie d’un 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 l’appli

data les données du projet, un schéma de base de données, des commandes SQL

doc Documentation de l’appli

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 16: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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.

Page 17: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

validate Dédié aux fichiers de configuration pour la validation des formulaires

Page 18: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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/402335716/sizes/l/

Page 19: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 20: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Créer un projet symfony

1. Créer un répertoire pour le projet/path_to_web_dir/myproject

2. « Se mettre » dans ce répertoirecd /path_to_web_dir/myproject

3. Tapersymfony init-project myproject

4. La structure du projet symfony est créé automatiquementN.B. le répertoire apps est vide

Page 21: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Créer une application dans le projet

1. « Se mettre » dans ce répertoirecd /path_to_web_dir/myproject/

2. Tapersymfony init-app myapp

3. Un répertoire /path_to_web_dir/myproject/myapp/ est créé

4. La strucutre d’application est créé dans /path_to_web_dir/myproject/myapp/

5. Deux fichiers sont également créés dans /path_to_web_dir/myproject/web/

– index.php– myapp_dev.php

Page 22: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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é pans le répertoire PEAR) accessibles

• mode_rewrite doit être activé• N’oubliez pas de recharger la conf du serveur

(avec classe ;-) )apache2ctl graceful

• Tester myapp.example.com

Page 23: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 24: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Hébergement en mutualisé

• Changer le répertoire web– Dans config/config.php ou dans chaque

apps/myApp/config/config.php$sf_root_dir = sfConfig::get('sf_root_dir');

sfConfig::add(array(

'sf_web_dir_name' => $sf_web_dir_name = 'www',

'sf_web_dir' => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name,

'sf_upload_dir' => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'),

)

);  

• Customiser le myproject/www/.htaccess

Page 25: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Ça marche!!

Page 26: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Création d’un module

1. « Se mettre » dans ce répertoirecd /path_to_web_dir/myproject/

2. Tapersymfony init-module myapp mymodule

3. La structure est créée– myproject/apps/myapp/modules/mymodule/actions/actions.class.php

– myproject/apps/myapp/modules/mymodule/templates/indexSuccess.php

4. Tester http://localhost/myapp_dev.php/mymodule/index

Page 27: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Les conteneurs de paramètres …

• Utilisés par beaucoup de classes symfony– Par exemple $reponse un objet de classe

sfReponse• $response->getParameterHolder()->set('foo', 'bar');$response->setParameter('foo', ‘bar');• $response->getParameterHolder()->get('foo'); $response->getParameter('foo');

– Valeur par défaut• $response->getParameter('foo', ‘bar');

Page 28: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

…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 29: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 objectsfConfig::set('sf_foo', 'bar'); echo sfConfig::get('sf_foo');

Page 30: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Auto-chargement des classes

• Plus besoin de <?php include 'classes/MyClass.php'; ?>• Pour faire un<?php $myObject = new MyClass(); ?>• 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 n’avez jamais à inclure une classe dans

symfony!

Page 31: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

> cd ~/myproject

> symfony init-module myapp mymodule

Page 32: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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.

Page 33: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Contenu du contrôleur

class mymoduleActions extends sfActions{

public function executeIndex() {

$this->forward('default', 'module'); }

} • Le code par défaut reroute l’action index vers l’action

‘default’ du module ‘module’• Appel par convention de nommage le template

templates/indexSuccess.php si l’action n’est pas reroutée• Visible sur

– http://localhost/myapp_dev.php/mymodule/index – http://localhost/myapp_dev.php/mymodule/

Page 34: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Ajout de 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 35: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 36: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Nourrir ses templates• Symfony rend les attributs du contrôleur visible 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 37: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 38: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Le cas des formulaires – en PHP

<form method="post" action="/myapp.php/mymodule/anotherAction">

<label for="name">What is your name?</label>

<input type="text" name="name" id="name" value="" />

<input type="submit" value="Ok" />

</form>

Page 39: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Avec les helpers symfony

<?php echo form_tag('mymodule/anotherAction') ?>

<?php echo label_for('name', 'What is your name?') ?>

<?php echo input_tag('name') ?>

<?php echo submit_tag('Ok') ?>

</form> • Meilleur clareté du code, plus rapide, plus concis• Customisable via des tableaux d’options

Page 40: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 41: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

Exemple de tableau d’options pour un helper

<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous', array(

'class' => 'special_link', 'confirm' => 'Are you sure?', 'absolute' => true

)) ?>

<?php echo link_to('I never say my name', 'mymodule/anotherAction?name=anonymous', 'class=special_link confirm=Are you sure? absolute=true‘

) ?>

<a class="special_link" onclick="return confirm('Are you sure?');" href="http://localhost/myapp.php/mymodule/anotherAction/name/anonymous">

I never say my name</a>

Page 42: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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'); }

}

• 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 43: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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 44: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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

Page 45: Symfony . Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit

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.