SlideShare une entreprise Scribd logo
Développer mieux en
PHP avec
HugoHamon-ForumPHPAFUP2010–Paris–10/11/2010
Qui  suis-­‐‑je  ?	
v  Hugo HAMON (@hhamon)
v  Responsable des formations à
v  Premiers pas avec PHP en 2002
v  Secrétaire de l’AFUP
v  Auteur du site Apprendre-PHP.com
v  Coauteur & contributeur à des ouvrages Eyrolles
Symfony, un framework
professionnel !
Le projet symfony…
symfony 1.0 symfony 1.1 symfony 1.4 Symfony 2.0
License MIT
Version actuelle 1.0.22 1.1.9 1.4.8 2.0.0 - PR
Date de sortie Octobre 2005 Juin 2008 Novembre 2009 Mars 2011
Support Terminé Terminé Fin 2012 ?
Stabilité Stable Stable Stable Presque stable
Production Oui Oui Oui Bientôt
Documentation Oui Oui Oui En cours
Ø  Documentation Open-Source
Ø  API stable et fiable
Ø  Communauté active
Ø  Plugins Open-Source
Ø  Développeurs sur le marché
Ø  Formation & Consulting
Un  riche  écosystème
Ils  utilisent  symfony
Résoudre les
problématiques du
développement web.
Industrialiser les développements1.
Industrialiser	
§ Développer plus vite
§ Développer mieux
§ Réduire les coûts de développement
§ Favoriser la réutilisabilité du code
§ Simplifier les opérations de maintenance
§ Simplifier les déploiements
Coût  de  développement	
Dv	
T	
$	
Dev
Test
Coût  de  maintenance	
C	
M	
T	
D	
$$$	
Compréhension
Test
Déploiement
Modification
Coût	
Développement	
$	
Coût	
Maintenance	
$$$	
Compréhension	
Correction	
Test	
Déploiement	
Développement	
Test
Objectifs  ?	
Moins  de  
Code	
Moins  de  
complexité	
Moins  de  
bogues	
Plus  de  
Productivité	
Plus  de  
temps
Automatiser  des  tâches  pénibles
Déboguer  plus  vite	
Web DebugToolbar
² Requêtes SQL
² Logs
² Variables d’environnement ($_GET, $_POST, $_COOKIE…)
² Configuration de PHP
² Timers
² Variables de configuration de Symfony
Stack traces
Déboguer  plus  vite  (Symfony2)	
Profiler
Journalisation  des  logs	
² Requêtes SQL, en-têtes envoyés, exceptions attrapées…
Simplifier  les  déploiements	
$ php symfony project:deploy production --go
[production]
host=123.456.7.8
user=hhamon
port=22
path=/var/www/www.monsite.com
Déploiement automatisé avec une connexion SSH + RSYNC
Configuration des serveurs de déploiement dans un fichier INI
Favoriser le travail en équipe2.
Arborescence  connue	
$ tree -L 1 -F
.
|-- apps/
|-- cache/
|-- config/
|-- data/
|-- lib/
|-- log/
|-- plugins/
|-- symfony*
|-- test/
`-- web/
9 directories, 1 file
q  Applications
q  Cache
q  Configuration globale
q  Données du projet
q  Classes PHP
q  Journaux de logs
q  Plugins installés
q  Tests automatisés
q  Fichiers publics
Conventions  de  codage	
q  Nommage des fichiers
q  Nommage des variables
q  Philosophie de codage
q  Même outillage pour tout le monde
Architecture  MVC
# apps/frontend/modules/post/actions/actions.class.php
class postActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$this->posts = PostTable::getInstance()->getMostRecents(10);
}
}
Couche Contrôleur :
CoucheVue :
# apps/frontend/modules/post/templates/indexSuccess.php	
<?php foreach ($posts as $post) : ?>	
<h2><?php echo $post->getTitle() ?></h2>	
<div class="content">	
<?php echo simple_format_text($post->getContent()) ?>	
</div>	
<?php endforeach ?>
# lib/model/doctrine/PostTable.class.php
class PostTable extends Doctrine_Table
{
public function getMostRecents($limit)
{
return $this->
createQuery('a')->
where('a.is_published = ?', true)->
orderBy('a.published_at desc')->
limit($limit)->
execute();
}
}
Couche Modèle (Doctrine ORM) :
Ne pas réinventer la roue3.
Configuration  des  URLs	
q Optimisation pour les SEO
q Faciles à bookmarker, mémoriser ou échanger
q Masquent l’implémentation technique
http://www.domain.tld/blog.php?action=show&id=12546
http://www.domain.tld/blog/2010/11/10/forum-php-afup
URL PHP
URL Symfony
Configuration  YAML  des  URLs	
signin:
url: /:sf_culture/login
param: { module: authentication, action: login }
requirements: { sf_culture: (?:en|fr) }
signout:
url: /:sf_culture/logout
param: { module: authentication, action: logout }
requirements: { sf_culture: (?:en|fr) }
my_account:
url: /:sf_culture/account
param: { module: home, action: showAccount }
requirements: { sf_culture: (?:en|fr) }
products:
url: /:sf_culture/shop/:page
param: { module: product, action: index, page: 1 }
requirements: { sf_culture: (?:en|fr), page: d+ }
Accès  aux  bases  de  données	
§  Projets matures
§  Pilotés par F. Zaninotto & J.Wage
§  Abstraction de BDD & ORM
§  PDO pour couche basse
§  Nombreuses BDD supportées
§  Génération de code et behaviors
§  API abstraite et OO de requêtes SQL
§  Migrations
ORM  /  Active  Record	
$speaker = new Speaker();
$speaker->setFirstName('Hugo');
$speaker->setLastName('Hamon');
$conference = new Conference();
$conference->setSpeaker($speaker);
$conference->setTitle('Introduction à symfony');
$conference->setSchedule('2010-11-10 09:00:00');
$conference->save();
Sauvegarde des deux enregistrements en BDD
Traitement  des  formulaires	
§ Simplifier la création et la validation des formulaires
§ API entièrement orientée objet
§ Flexible et extensible
§ Intégration avec les ORMs
§ Nombreux validateurs et « widgets » livrés
§ Simplicité d’utilisation pour les intégrateurs web
class ContactForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
'email' => new sfWidgetFormInputText(),
'message' => new sfWidgetFormTextarea()
));
$this->setValidators(array(
'email' => new sfValidatorEmail(),
'message' => new sfValidatorString()
));
$this->widgetSchema->setNameFormat('contact[%s]');
}
}
class contactActions extends sfActions	
{	
public function executeProcessForm(sfWebRequest $request)	
{	
$this->forward404Unless($request->getMethod('post'));	
	
$this->form = new ContactForm();	
$this->form->bind($request->getParameter('contact'));	
	
if ($this->form->isValid())	
{	
$values = $this->form->getValues();	
	
// ... do something	
	
$this->redirect('contact/thankYou');	
}	
}	
}
I18N  &  L10N	
§ Sites multilingues
§ Formatage de dates, monnaies, nombres…
§ Gestion des pluriels
§ Localisation des chaînes de l’interface
§ Support des tables I18N par les ORMs
§ Gestion automatique de la culture de l’utilisateur
I18N  &  L10N	
<p>
<?php echo __('Hello, my name is %name%', array(
'%name%' => 'Hugo’
)) ?>.
</p>
<p>
It costs <?php echo format_currency(125990, 'EUR') ?>.
</p>
<p>
There are <?php echo format_number(1350) ?> people here.
</p>
Authentification  et  ACLs	
§ Authentification de l’utilisateur
§ Gestion des droits d’accès
$user->setAuthenticated(true);
$user->isAuthenticated();
$user->addCredentials(array('AUTHOR', 'PUBLISHER'));
$user->hasCredential('PUBLISHER');
Envoi  d’emails	
§ Intégration de Swift Mailer
§ API orientée objet
§ Flexible et extensible
§ Support des files d’attente de mails
§ Entièrement configurable
§ Intégration avec les ORMs
Envoi  d’emails	
$mail = $this->getMailer()->compose(	
'you@example.com', 	
'me@example.com', 	
'Hell You!', 	
"Hey guy, what's up ?"	
);	
	
$mail->setPriority(3);	
$mail->attach(Swift_Attachment::fromPath('file.pdf'));	
	
$this->getMailer()->send($mail);	
Le mailer est entièrement configurable
Sécurité de l’application4.
Sécurité	
q Echappement automatique des variables de vue
q Sécurisation des formulaires avec des jetons uniques
q Requêtes préparées par les ORMs
$speaker = Doctrine_Query::create()->
from('Speaker s')->
where('s.last_name LIKE ?', '%Hamon%')->
fetchOne();
Configuration  d’Apache	
q Accès au répertoire web/ depuis un navigateur
<VirtualHost *:80>
ServerName www.my-domain.com
DocumentRoot "/path/to/SymfonyProject/web"
<Directory "/path/to/SymfonyProject/web">
AllowOverride All
Allow from All
</Directory>
Alias /sf /path/to/SymfonyProject/lib/vendor/symfony/data/web/sf
<Directory "/path/to/SymfonyProject/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
Générer des backoffices5.
Admin  Generator	
q Génération de backoffice
q Liste
q Ajout
q Modification
q Suppression
q Filtres de recherche
q Pagination
q Entièrement configurable
q Gestion des droits d’accès
q Extensible / Surchargeable
Admin  Generator	
$ php symfony doctrine:generate-admin backend Product
generator:
class: sfDoctrineGenerator
param:
# ...
config:
actions:
_edit: { credentials: [ADMIN_PRODUCTS] }
fields:
name: { label: Nom du produit }
reference: { label: Référence }
price: { label: Prix }
is_published: { label: Publication ? }
categories_list: { label: Catégories }
list:
batch_actions:
unlinkCategories:
credentials: [[ADMIN_PRODUCTS, EDIT_PRODUCT]]
label: Rendre orphelins
_delete:
credentials: [ADMIN_PRODUCTS]
Configuration  en  YAML
Etendre les fonctionnalités6.
Ligne  de  commandes	
q Le framework de tâches automatisées peut accueillir de
nouvelles commandes personnalisées.
Ligne  de  commandes	
class sfGuardAddPermissionTask extends sfBaseTask	
{	
protected function configure()	
{	
// ...	
	
$this->namespace = 'guard';	
$this->name = 'add-permission';	
$this->briefDescription = 'Adds a new permission';	
}	
	
protected function execute($arguments = array(), 	
$options = array())	
{	
// ...	
}	
}
Plugins  communautaires	
q Près d’un millier de plugins Open-Source disponibles
q Faciles à installer et à utiliser
Composants  de  Zend  Framework	
q Intégration des composants du Zend Framework
q Outils éprouvés et testés
q Interopérabilité entre les deux projets
q Zend_Soap, Zend_Lucene, Zend_Service_Twitter…
q Obtenez que le meilleur des deux mondes J
Garantir la qualité du code7.
Tests  unitaires	
q Symfony 1.x : Lime
q Symfony 2.x : PHPUnit 3.5
q Vérifier que le code est correct
q Faciliter la détection des bogues et des régressions
q Documenter le code
Tests  unitaires
Tests  fonctionnels	
q Vérifier les fonctionnalités de l’application
q Simuler un scénario de navigation sur le site
q Tester toutes les couches (request, response, user…)
q API qui simule un véritable navigateur web
q Syntaxe verbeuse et intuitive
Tests  fonctionnels	
include(dirname(__FILE__).'/../../bootstrap/functional.php');	
	
$browser = new sfTestFunctional(new sfBrowser());	
	
$browser->	
get('/en/contact')->	
	
with('response')->isStatusCode(200)->	
	
click('send', array(	
'contact' => array(	
'name' => '',	
'email' => 'foo',	
'message' => 'Lorem ipsum...' 	
)	
), array('_with_csrf' => true));
Tests  fonctionnels
Performances & scalabilité8.
Rôle  du  cache  de  symfony	
q Cache de la configurationYAML
q Cache des dictionnaires de traduction XLIFF
q Cache des pages HTML
q Cache des requêtes SQL (Doctrine)
q => Répondre plus vite à une requête HTTP
Performances  de  Symfony2	
q  Bénéfices des optimisations apportées à PHP 5.3
q  Conteneur d’Injection de Dépendances
q Chargement à la demande des objets
q Limitation de l’occupation mémoire
q  Cache HTTP performant et très flexible
q Performances accrues avec un Reverse Proxy (Varnish / Squid)
q Support des ESI – Edge Side Includes – RFC 2616
Surcharge  du  coeur	
q Possibilité de redéfinir la configuration de symfony
q Ex : Request, Response, User, Cache, I18N, Mailer…
dev:
mailer:
param:
delivery_strategy: none
transport:
class: Swift_NullTransport
Contribuer à Symfony9.
Contribuer  au  projet	
q Documentation (blog, traductions…)
q Canaux de discussion (IRC, forums, mailing lists, twitter)
q Code source (patches, bogues)
q Plugins
q Conférences
q Bouche à oreille
Merci !
Sensio S.A.
92-98, boulevardVictor Hugo
92 115 Clichy Cedex
FRANCE
Tél. : +33 1 40 99 80 80
www.sensiolabs.com - www.symfony-project.org - trainings.sensiolabs.com

Contenu connexe

PPTX
Symfony 2 : chapitre 1 - Présentation Générale
PDF
Orchestrez vos projets Symfony sans fausses notes
PPT
Symfony 2 : chapitre 2 - Les vues en Twig
PPTX
Atelier Symfony2- Introduction
ODP
Symfony Best Practices
PDF
Symfony2: 30 astuces et bonnes pratiques
PPT
Presentation Symfony
ODP
Presentation du framework symfony
Symfony 2 : chapitre 1 - Présentation Générale
Orchestrez vos projets Symfony sans fausses notes
Symfony 2 : chapitre 2 - Les vues en Twig
Atelier Symfony2- Introduction
Symfony Best Practices
Symfony2: 30 astuces et bonnes pratiques
Presentation Symfony
Presentation du framework symfony

Tendances (20)

PPTX
Presentation Symfony2
PPTX
Présentation symfony epita
PDF
symfony : Un Framework Open-Source pour les Professionnels
PDF
Introduction à Symfony2
PDF
Une application en deux heure - PHP Québec Janvier 2009
PPTX
Symfony 2 et le Web
PDF
Présentation de symfony - Human talks aux docks le 8 juillet 2014
PDF
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
PDF
Symfony2 Presentation
PPTX
Symfony3 overview
PDF
Formation Symfony2 par KNP Labs
PPT
Symfony 2 : chapitre 4 - Les services et les formulaires
PPT
Soutenance Zend Framework vs Symfony
PPT
PHP5 et Zend Framework
PDF
Utiliser le Zend Framework avec Symfony
PDF
wallabag, comment on a migré vers symfony3
PPT
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
PPT
Principes De Base De Asp .Net
PDF
Django pour les développeurs Symfony (et réciproquement)
PDF
PHP Composer : Pourquoi ? Comment ? Et plus ...
Presentation Symfony2
Présentation symfony epita
symfony : Un Framework Open-Source pour les Professionnels
Introduction à Symfony2
Une application en deux heure - PHP Québec Janvier 2009
Symfony 2 et le Web
Présentation de symfony - Human talks aux docks le 8 juillet 2014
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Symfony2 Presentation
Symfony3 overview
Formation Symfony2 par KNP Labs
Symfony 2 : chapitre 4 - Les services et les formulaires
Soutenance Zend Framework vs Symfony
PHP5 et Zend Framework
Utiliser le Zend Framework avec Symfony
wallabag, comment on a migré vers symfony3
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Principes De Base De Asp .Net
Django pour les développeurs Symfony (et réciproquement)
PHP Composer : Pourquoi ? Comment ? Et plus ...
Publicité

En vedette (20)

PDF
Trois avancées majeures en CSS3 : Mediaqueries, Grid Layout et Animations (MS...
PDF
Presentation symfony
PDF
Bases de PHP - Partie 1
PDF
Tutoriel java
PDF
Design Patterns avec PHP 5.3, Symfony et Pimple
PPTX
PDF
Monitor the quality of your Symfony projects
PDF
Liberating your data
PDF
API First
PPTX
API 101 Workshop from APIStrat Conference
PDF
Prototyping in the cloud
PPTX
Designing for developers
PDF
Symfony2 en pièces détachées
PDF
Quantifying fitness
PDF
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
PPTX
Facebook appsincloud
PDF
The History of PHPersistence
PPTX
Speed up your developments with Symfony2
PPT
Liberating your data
Trois avancées majeures en CSS3 : Mediaqueries, Grid Layout et Animations (MS...
Presentation symfony
Bases de PHP - Partie 1
Tutoriel java
Design Patterns avec PHP 5.3, Symfony et Pimple
Monitor the quality of your Symfony projects
Liberating your data
API First
API 101 Workshop from APIStrat Conference
Prototyping in the cloud
Designing for developers
Symfony2 en pièces détachées
Quantifying fitness
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
Facebook appsincloud
The History of PHPersistence
Speed up your developments with Symfony2
Liberating your data
Publicité

Similaire à Mieux Développer en PHP avec Symfony (20)

PPTX
Introduction à Symfony
PPTX
Introduction à Symfony
PDF
cours.symfony.web2pouringenieurseninformatique
PPTX
retour sur confoo2011 et Symfony2
PPTX
Symfony2 - Un Framework PHP 5 Performant
PDF
Etude des Frameworks PHP
PDF
Atelier symfony n 2
PDF
Symfony 4 2019
PDF
php.Cours Symfony (database_connection & entities & orm)
PDF
Atelier symfony n 1
PDF
De legacy à symfony
PPTX
Meetup CakePHP Amiens / 25 mars 2015
PDF
symfony : Simplifier le développement des interfaces bases de données (PHP ...
PPTX
Développer et déployer une application php maintenable
PPTX
CodeIgniter_created_by_amine_oubouisk.pptx
PDF
Diaporama du sfPot Lillois du 20 mars 2014
PPTX
Drupal 8, symfony
PDF
Boostez vos-developpements-symfony-avec-phpedit
PDF
Symfony_6_-_Atelier_1-_creation_d_un_projet.pdf
PDF
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
Introduction à Symfony
Introduction à Symfony
cours.symfony.web2pouringenieurseninformatique
retour sur confoo2011 et Symfony2
Symfony2 - Un Framework PHP 5 Performant
Etude des Frameworks PHP
Atelier symfony n 2
Symfony 4 2019
php.Cours Symfony (database_connection & entities & orm)
Atelier symfony n 1
De legacy à symfony
Meetup CakePHP Amiens / 25 mars 2015
symfony : Simplifier le développement des interfaces bases de données (PHP ...
Développer et déployer une application php maintenable
CodeIgniter_created_by_amine_oubouisk.pptx
Diaporama du sfPot Lillois du 20 mars 2014
Drupal 8, symfony
Boostez vos-developpements-symfony-avec-phpedit
Symfony_6_-_Atelier_1-_creation_d_un_projet.pdf
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter

Plus de Hugo Hamon (7)

PDF
Database Design Patterns
PDF
Silex meets SOAP & REST
PDF
Intégration Continue PHP avec Jenkins CI
PDF
Symfony2 - extending the console component
PDF
Développeurs, cachez-moi ça ! (Paris Web 2011)
PDF
Build powerfull and smart web applications with Symfony2
PDF
Intégration continue des projets PHP avec Jenkins
Database Design Patterns
Silex meets SOAP & REST
Intégration Continue PHP avec Jenkins CI
Symfony2 - extending the console component
Développeurs, cachez-moi ça ! (Paris Web 2011)
Build powerfull and smart web applications with Symfony2
Intégration continue des projets PHP avec Jenkins

Mieux Développer en PHP avec Symfony

  • 1. Développer mieux en PHP avec HugoHamon-ForumPHPAFUP2010–Paris–10/11/2010
  • 2. Qui  suis-­‐‑je  ? v  Hugo HAMON (@hhamon) v  Responsable des formations à v  Premiers pas avec PHP en 2002 v  Secrétaire de l’AFUP v  Auteur du site Apprendre-PHP.com v  Coauteur & contributeur à des ouvrages Eyrolles
  • 4. Le projet symfony… symfony 1.0 symfony 1.1 symfony 1.4 Symfony 2.0 License MIT Version actuelle 1.0.22 1.1.9 1.4.8 2.0.0 - PR Date de sortie Octobre 2005 Juin 2008 Novembre 2009 Mars 2011 Support Terminé Terminé Fin 2012 ? Stabilité Stable Stable Stable Presque stable Production Oui Oui Oui Bientôt Documentation Oui Oui Oui En cours
  • 5. Ø  Documentation Open-Source Ø  API stable et fiable Ø  Communauté active Ø  Plugins Open-Source Ø  Développeurs sur le marché Ø  Formation & Consulting Un  riche  écosystème
  • 9. Industrialiser § Développer plus vite § Développer mieux § Réduire les coûts de développement § Favoriser la réutilisabilité du code § Simplifier les opérations de maintenance § Simplifier les déploiements
  • 13. Objectifs  ? Moins  de   Code Moins  de   complexité Moins  de   bogues Plus  de   Productivité Plus  de   temps
  • 16. ² Requêtes SQL ² Logs ² Variables d’environnement ($_GET, $_POST, $_COOKIE…) ² Configuration de PHP ² Timers ² Variables de configuration de Symfony
  • 18. Déboguer  plus  vite  (Symfony2) Profiler
  • 19. Journalisation  des  logs ² Requêtes SQL, en-têtes envoyés, exceptions attrapées…
  • 20. Simplifier  les  déploiements $ php symfony project:deploy production --go [production] host=123.456.7.8 user=hhamon port=22 path=/var/www/www.monsite.com Déploiement automatisé avec une connexion SSH + RSYNC Configuration des serveurs de déploiement dans un fichier INI
  • 21. Favoriser le travail en équipe2.
  • 22. Arborescence  connue $ tree -L 1 -F . |-- apps/ |-- cache/ |-- config/ |-- data/ |-- lib/ |-- log/ |-- plugins/ |-- symfony* |-- test/ `-- web/ 9 directories, 1 file q  Applications q  Cache q  Configuration globale q  Données du projet q  Classes PHP q  Journaux de logs q  Plugins installés q  Tests automatisés q  Fichiers publics
  • 23. Conventions  de  codage q  Nommage des fichiers q  Nommage des variables q  Philosophie de codage q  Même outillage pour tout le monde
  • 25. # apps/frontend/modules/post/actions/actions.class.php class postActions extends sfActions { public function executeIndex(sfWebRequest $request) { $this->posts = PostTable::getInstance()->getMostRecents(10); } } Couche Contrôleur : CoucheVue : # apps/frontend/modules/post/templates/indexSuccess.php <?php foreach ($posts as $post) : ?> <h2><?php echo $post->getTitle() ?></h2> <div class="content"> <?php echo simple_format_text($post->getContent()) ?> </div> <?php endforeach ?>
  • 26. # lib/model/doctrine/PostTable.class.php class PostTable extends Doctrine_Table { public function getMostRecents($limit) { return $this-> createQuery('a')-> where('a.is_published = ?', true)-> orderBy('a.published_at desc')-> limit($limit)-> execute(); } } Couche Modèle (Doctrine ORM) :
  • 27. Ne pas réinventer la roue3.
  • 28. Configuration  des  URLs q Optimisation pour les SEO q Faciles à bookmarker, mémoriser ou échanger q Masquent l’implémentation technique http://www.domain.tld/blog.php?action=show&id=12546 http://www.domain.tld/blog/2010/11/10/forum-php-afup URL PHP URL Symfony
  • 29. Configuration  YAML  des  URLs signin: url: /:sf_culture/login param: { module: authentication, action: login } requirements: { sf_culture: (?:en|fr) } signout: url: /:sf_culture/logout param: { module: authentication, action: logout } requirements: { sf_culture: (?:en|fr) } my_account: url: /:sf_culture/account param: { module: home, action: showAccount } requirements: { sf_culture: (?:en|fr) } products: url: /:sf_culture/shop/:page param: { module: product, action: index, page: 1 } requirements: { sf_culture: (?:en|fr), page: d+ }
  • 30. Accès  aux  bases  de  données §  Projets matures §  Pilotés par F. Zaninotto & J.Wage §  Abstraction de BDD & ORM §  PDO pour couche basse §  Nombreuses BDD supportées §  Génération de code et behaviors §  API abstraite et OO de requêtes SQL §  Migrations
  • 31. ORM  /  Active  Record $speaker = new Speaker(); $speaker->setFirstName('Hugo'); $speaker->setLastName('Hamon'); $conference = new Conference(); $conference->setSpeaker($speaker); $conference->setTitle('Introduction à symfony'); $conference->setSchedule('2010-11-10 09:00:00'); $conference->save(); Sauvegarde des deux enregistrements en BDD
  • 32. Traitement  des  formulaires § Simplifier la création et la validation des formulaires § API entièrement orientée objet § Flexible et extensible § Intégration avec les ORMs § Nombreux validateurs et « widgets » livrés § Simplicité d’utilisation pour les intégrateurs web
  • 33. class ContactForm extends sfForm { public function configure() { $this->setWidgets(array( 'email' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea() )); $this->setValidators(array( 'email' => new sfValidatorEmail(), 'message' => new sfValidatorString() )); $this->widgetSchema->setNameFormat('contact[%s]'); } }
  • 34. class contactActions extends sfActions { public function executeProcessForm(sfWebRequest $request) { $this->forward404Unless($request->getMethod('post')); $this->form = new ContactForm(); $this->form->bind($request->getParameter('contact')); if ($this->form->isValid()) { $values = $this->form->getValues(); // ... do something $this->redirect('contact/thankYou'); } } }
  • 35. I18N  &  L10N § Sites multilingues § Formatage de dates, monnaies, nombres… § Gestion des pluriels § Localisation des chaînes de l’interface § Support des tables I18N par les ORMs § Gestion automatique de la culture de l’utilisateur
  • 36. I18N  &  L10N <p> <?php echo __('Hello, my name is %name%', array( '%name%' => 'Hugo’ )) ?>. </p> <p> It costs <?php echo format_currency(125990, 'EUR') ?>. </p> <p> There are <?php echo format_number(1350) ?> people here. </p>
  • 37. Authentification  et  ACLs § Authentification de l’utilisateur § Gestion des droits d’accès $user->setAuthenticated(true); $user->isAuthenticated(); $user->addCredentials(array('AUTHOR', 'PUBLISHER')); $user->hasCredential('PUBLISHER');
  • 38. Envoi  d’emails § Intégration de Swift Mailer § API orientée objet § Flexible et extensible § Support des files d’attente de mails § Entièrement configurable § Intégration avec les ORMs
  • 39. Envoi  d’emails $mail = $this->getMailer()->compose( 'you@example.com', 'me@example.com', 'Hell You!', "Hey guy, what's up ?" ); $mail->setPriority(3); $mail->attach(Swift_Attachment::fromPath('file.pdf')); $this->getMailer()->send($mail); Le mailer est entièrement configurable
  • 41. Sécurité q Echappement automatique des variables de vue q Sécurisation des formulaires avec des jetons uniques q Requêtes préparées par les ORMs $speaker = Doctrine_Query::create()-> from('Speaker s')-> where('s.last_name LIKE ?', '%Hamon%')-> fetchOne();
  • 42. Configuration  d’Apache q Accès au répertoire web/ depuis un navigateur <VirtualHost *:80> ServerName www.my-domain.com DocumentRoot "/path/to/SymfonyProject/web" <Directory "/path/to/SymfonyProject/web"> AllowOverride All Allow from All </Directory> Alias /sf /path/to/SymfonyProject/lib/vendor/symfony/data/web/sf <Directory "/path/to/SymfonyProject/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>
  • 44. Admin  Generator q Génération de backoffice q Liste q Ajout q Modification q Suppression q Filtres de recherche q Pagination q Entièrement configurable q Gestion des droits d’accès q Extensible / Surchargeable
  • 45. Admin  Generator $ php symfony doctrine:generate-admin backend Product
  • 46. generator: class: sfDoctrineGenerator param: # ... config: actions: _edit: { credentials: [ADMIN_PRODUCTS] } fields: name: { label: Nom du produit } reference: { label: Référence } price: { label: Prix } is_published: { label: Publication ? } categories_list: { label: Catégories } list: batch_actions: unlinkCategories: credentials: [[ADMIN_PRODUCTS, EDIT_PRODUCT]] label: Rendre orphelins _delete: credentials: [ADMIN_PRODUCTS] Configuration  en  YAML
  • 48. Ligne  de  commandes q Le framework de tâches automatisées peut accueillir de nouvelles commandes personnalisées.
  • 49. Ligne  de  commandes class sfGuardAddPermissionTask extends sfBaseTask { protected function configure() { // ... $this->namespace = 'guard'; $this->name = 'add-permission'; $this->briefDescription = 'Adds a new permission'; } protected function execute($arguments = array(), $options = array()) { // ... } }
  • 50. Plugins  communautaires q Près d’un millier de plugins Open-Source disponibles q Faciles à installer et à utiliser
  • 51. Composants  de  Zend  Framework q Intégration des composants du Zend Framework q Outils éprouvés et testés q Interopérabilité entre les deux projets q Zend_Soap, Zend_Lucene, Zend_Service_Twitter… q Obtenez que le meilleur des deux mondes J
  • 52. Garantir la qualité du code7.
  • 53. Tests  unitaires q Symfony 1.x : Lime q Symfony 2.x : PHPUnit 3.5 q Vérifier que le code est correct q Faciliter la détection des bogues et des régressions q Documenter le code
  • 55. Tests  fonctionnels q Vérifier les fonctionnalités de l’application q Simuler un scénario de navigation sur le site q Tester toutes les couches (request, response, user…) q API qui simule un véritable navigateur web q Syntaxe verbeuse et intuitive
  • 56. Tests  fonctionnels include(dirname(__FILE__).'/../../bootstrap/functional.php'); $browser = new sfTestFunctional(new sfBrowser()); $browser-> get('/en/contact')-> with('response')->isStatusCode(200)-> click('send', array( 'contact' => array( 'name' => '', 'email' => 'foo', 'message' => 'Lorem ipsum...' ) ), array('_with_csrf' => true));
  • 59. Rôle  du  cache  de  symfony q Cache de la configurationYAML q Cache des dictionnaires de traduction XLIFF q Cache des pages HTML q Cache des requêtes SQL (Doctrine) q => Répondre plus vite à une requête HTTP
  • 60. Performances  de  Symfony2 q  Bénéfices des optimisations apportées à PHP 5.3 q  Conteneur d’Injection de Dépendances q Chargement à la demande des objets q Limitation de l’occupation mémoire q  Cache HTTP performant et très flexible q Performances accrues avec un Reverse Proxy (Varnish / Squid) q Support des ESI – Edge Side Includes – RFC 2616
  • 61. Surcharge  du  coeur q Possibilité de redéfinir la configuration de symfony q Ex : Request, Response, User, Cache, I18N, Mailer… dev: mailer: param: delivery_strategy: none transport: class: Swift_NullTransport
  • 63. Contribuer  au  projet q Documentation (blog, traductions…) q Canaux de discussion (IRC, forums, mailing lists, twitter) q Code source (patches, bogues) q Plugins q Conférences q Bouche à oreille
  • 64. Merci ! Sensio S.A. 92-98, boulevardVictor Hugo 92 115 Clichy Cedex FRANCE Tél. : +33 1 40 99 80 80 www.sensiolabs.com - www.symfony-project.org - trainings.sensiolabs.com