PHP a son lot de surprises qui pimente notre vie de développeur : le code qui meurt d’un coup de namespace, strpos qui ne trouve pas sa chaîne et les tableaux qui se modifient sans qu’on y touche. Ca vous énerve vous aussi ? Alors, en 20 minutes, on va dresser un florilège des erreurs les plus vicieuses, comment les corriger et comment les garder loin de votre code. Attachez vos ceintures !
Présentation effectuée au Meetup Programmez (08 septembre 2020)par Christophe Villeneuve sur "Etes-vous prêt pour PHP 8 ?".
Vous allez voir l'avancement du langage PHP, les nouveautés, les améliorations
PHP : (Hypertext Preprocessor") est un langage de scripts:
Coté serveur,
Open Source,
et spécialement conçu pour le développement d'applications web.
Il peut être intégré facilement au HTML.
PHP a son lot de surprises qui pimente notre vie de développeur : le code qui meurt d’un coup de namespace, strpos qui ne trouve pas sa chaîne et les tableaux qui se modifient sans qu’on y touche. Ca vous énerve vous aussi ? Alors, en 20 minutes, on va dresser un florilège des erreurs les plus vicieuses, comment les corriger et comment les garder loin de votre code. Attachez vos ceintures !
Présentation effectuée au Meetup Programmez (08 septembre 2020)par Christophe Villeneuve sur "Etes-vous prêt pour PHP 8 ?".
Vous allez voir l'avancement du langage PHP, les nouveautés, les améliorations
PHP : (Hypertext Preprocessor") est un langage de scripts:
Coté serveur,
Open Source,
et spécialement conçu pour le développement d'applications web.
Il peut être intégré facilement au HTML.
Utiliser salt pour tester son infrastructure sur open stack ou dockerLogilab
Vous pouvez accéder à cette présentation sur ce lien : http://slides.logilab.fr/2015/poss2015_salt-docker/#/
Configurer et orchestrer son infrastructure avec un outil de gestion de configuration centralisée tel que Salt comporte de nombreux avantages.
La conservation et l'historisation des fichers de configuration dans un entrepôt de source geré par un DVCS (mercurial ou git) en fait partie.
Salt permet ensuite de faire évoluer son infrastructure en la testant dans des environements isolés. Une fois la description complète, reproduire une partie de son infrastructure de production sur un environnement virtualisé tel qu'un cloud
privé (OpenStack) devient possible et automatisable avec
*salt-cloud*. L'étape suivante est de pouvoir reproduire des portions de son infrastructure dans des conteneurs légers tels que docker ou lxc directement sur son portable. Pour cela, le pilotage de docker par salt et les fonctionnalités d'orchestration de salt permettent une agilité sans précédent.
Il s'agit d'un bon complément pour le TDI : Test Driven Infrastructure. L'infrastructure est testée en mode "intégration continue" et on peut tester et débugger une partie de l'infrastructure en mode "bac à sable".
Ce modèle peut ensuite être décliné avec l'utilisation des branches dans git ou mercurial où certaines branches vont être appliquées à la partie production de l'infrastructure alors que d'autres sont appliqués a la préproduction ou aux environnements docker ou lxc en local.
Salt est un outil de gestion de configuration centralisé généralement utilisé pour configurer et orchestrer son infrastructure système en bénéficiant de la conservation et de l'historisation des fichiers de configuration dans un entrepôt source géré par mercurial ou git. Toutefois, les possibilités offertes par Salt vont beaucoup plus loin. Une fois la description Salt de l'infrastructure de production terminée, il est possible d'en reproduire automatiquement tout ou partie
avec salt-cloud dans un environnement virtualisé (cloud privé OpenStack) et ainsi de pouvoir mener des tests. En allant plus loin, il est possible de reproduire des portions d'infrastructure dans des conteneurs légers (docker, lxc) et de travailler directement sur son ordinateur portable.
Les fonctionnalités d'orchestration de Salt et son pilotage de docker amènent une agilité sans précédent dans ce processus de travail.
Dans le modèle décrit ci-dessus, excellent complément du TDI (Test-Driven Infrastructure), l'infrastructure est testée et déboguée en mode "bac à sable" puis déployée selon un mécanisme automatisé d'intégration continue. Le modèle peut être décliné en utilisant des branches dans l’entrepôt source de Salt et en choisissant quelles branches sont appliquées
à l'infrastructure en production, en pré-production ou en test dans les environnements locaux (docker, lxc). Des mécanismes de relecture et de validation peuvent alors être mis en œuvre.
Lettre d'informations de ce mois de Février 2017.
- Invention à l'honneur : Opposite-wave de M. Jean-Michel Martinet
- Formation au CRED
- Transtech sur France 3
- Salon international des inventions de Genève
La programmation par contraintes avec Choco3 (Java)Aline Figoureux
Présentation rapide du concept de programmation par contraintes (Constraint programming) avec la librairie Java Choco3 lors du JUG du 9 Avril 2014 à Tours (France)
Pyconfr2015 : Marre de faire du C++ sur une Arduino ? Faites du Python avec M...Arthur Lutz
Introduction et démo de MicroPython sur une PyBoard.
MicroPython est une implémentation de Python3.4 pour microcontrôleurs (principalement la PyBoard carte en OpenHardware).
Venez faire clignoter des LEDs et bouger des moteurs directement depuis le prompt python !
Open close principle, on a dit étendre, pas extends !Engineor
Conférence en français sur le principe d'ouverture fermeture proposé à l'AFUP de Paris en février 2019, comportant des exemples d'implémentation du principe à l'aide de design patterns, avec ou sans utilisation d'un framework.
Ce travail expose le développement d’une nouvelle méthode d’analyse visant à optimiser l’exploitation de données issues de la presse dans une démarche
de compréhension des tendances d’innovation et du positionnement technologique des acteurs.
CIDOC-CRM + SPARQL Tutorial sur les données DoremusThomas Francart
Introduction aux requêtes SPARQL sur les données du projet Doremus (http://data.doremus.org) qui modélise et diffuse les données de création d'oeuvres musicales sur la base du modèle CIDOC-CRM / FRBRoo.
Slides de la Master Classe NodeJS : première édition faite le 27/09/2018 à Marseille
Couvre les aspects classiques (niveau débutant) de la création d'une application avec Node.
- Hello World bien sûr
- Faire des APIs avec Express
- Tester ses APIs
- Utiliser MongoDB
- Faire un client React => application MERN
- Quelques insights sur la sécurité avec Node
- Liens vers Github pour le code présenté
Retrouvez la lettre d'informations de ce mois de Mai.
Au programme :
- l'invention du mois avec Bioplumes
- Le concours Fab Life
- Le retour sur le RDV des innovations solidaires
Toujours disponible, jamais interrompu
Éclipse à été créé pour vous permettre de focaliser votre attention sur ce qui vous importe réellement sans jamais être interrompu par des notifications dont vous n'avez pas besoin instantanément.
http://minimaldisruption.fr
Invention à l'honneur : Fil Safe de Christine Chateau
Concours Tremplins I'NOV PRO 2017
MIE & Anabase : 2 associations pour vous aider dans la création d'entreprise.
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
SOLID est un acronyme représentant cinq principes de bases de la programmation orientée objet permettant le développement de logiciels fiables, évolutifs et robustes. Le framework Symfony est un excellent support pour illustrer chacun de ces principes. Nous verrons ainsi que SOLID est à l’origine de sa flexibilité, sa fiabilité mais aussi de sa maintenabilité et son évolutivité. Nous verrons également comment appliquer ces principes pour améliorer son code métier et perfectionner l’architecture de son application.
Contenu connexe
Similaire à Les patrons de conception du composant Form
Utiliser salt pour tester son infrastructure sur open stack ou dockerLogilab
Vous pouvez accéder à cette présentation sur ce lien : http://slides.logilab.fr/2015/poss2015_salt-docker/#/
Configurer et orchestrer son infrastructure avec un outil de gestion de configuration centralisée tel que Salt comporte de nombreux avantages.
La conservation et l'historisation des fichers de configuration dans un entrepôt de source geré par un DVCS (mercurial ou git) en fait partie.
Salt permet ensuite de faire évoluer son infrastructure en la testant dans des environements isolés. Une fois la description complète, reproduire une partie de son infrastructure de production sur un environnement virtualisé tel qu'un cloud
privé (OpenStack) devient possible et automatisable avec
*salt-cloud*. L'étape suivante est de pouvoir reproduire des portions de son infrastructure dans des conteneurs légers tels que docker ou lxc directement sur son portable. Pour cela, le pilotage de docker par salt et les fonctionnalités d'orchestration de salt permettent une agilité sans précédent.
Il s'agit d'un bon complément pour le TDI : Test Driven Infrastructure. L'infrastructure est testée en mode "intégration continue" et on peut tester et débugger une partie de l'infrastructure en mode "bac à sable".
Ce modèle peut ensuite être décliné avec l'utilisation des branches dans git ou mercurial où certaines branches vont être appliquées à la partie production de l'infrastructure alors que d'autres sont appliqués a la préproduction ou aux environnements docker ou lxc en local.
Salt est un outil de gestion de configuration centralisé généralement utilisé pour configurer et orchestrer son infrastructure système en bénéficiant de la conservation et de l'historisation des fichiers de configuration dans un entrepôt source géré par mercurial ou git. Toutefois, les possibilités offertes par Salt vont beaucoup plus loin. Une fois la description Salt de l'infrastructure de production terminée, il est possible d'en reproduire automatiquement tout ou partie
avec salt-cloud dans un environnement virtualisé (cloud privé OpenStack) et ainsi de pouvoir mener des tests. En allant plus loin, il est possible de reproduire des portions d'infrastructure dans des conteneurs légers (docker, lxc) et de travailler directement sur son ordinateur portable.
Les fonctionnalités d'orchestration de Salt et son pilotage de docker amènent une agilité sans précédent dans ce processus de travail.
Dans le modèle décrit ci-dessus, excellent complément du TDI (Test-Driven Infrastructure), l'infrastructure est testée et déboguée en mode "bac à sable" puis déployée selon un mécanisme automatisé d'intégration continue. Le modèle peut être décliné en utilisant des branches dans l’entrepôt source de Salt et en choisissant quelles branches sont appliquées
à l'infrastructure en production, en pré-production ou en test dans les environnements locaux (docker, lxc). Des mécanismes de relecture et de validation peuvent alors être mis en œuvre.
Lettre d'informations de ce mois de Février 2017.
- Invention à l'honneur : Opposite-wave de M. Jean-Michel Martinet
- Formation au CRED
- Transtech sur France 3
- Salon international des inventions de Genève
La programmation par contraintes avec Choco3 (Java)Aline Figoureux
Présentation rapide du concept de programmation par contraintes (Constraint programming) avec la librairie Java Choco3 lors du JUG du 9 Avril 2014 à Tours (France)
Pyconfr2015 : Marre de faire du C++ sur une Arduino ? Faites du Python avec M...Arthur Lutz
Introduction et démo de MicroPython sur une PyBoard.
MicroPython est une implémentation de Python3.4 pour microcontrôleurs (principalement la PyBoard carte en OpenHardware).
Venez faire clignoter des LEDs et bouger des moteurs directement depuis le prompt python !
Open close principle, on a dit étendre, pas extends !Engineor
Conférence en français sur le principe d'ouverture fermeture proposé à l'AFUP de Paris en février 2019, comportant des exemples d'implémentation du principe à l'aide de design patterns, avec ou sans utilisation d'un framework.
Ce travail expose le développement d’une nouvelle méthode d’analyse visant à optimiser l’exploitation de données issues de la presse dans une démarche
de compréhension des tendances d’innovation et du positionnement technologique des acteurs.
CIDOC-CRM + SPARQL Tutorial sur les données DoremusThomas Francart
Introduction aux requêtes SPARQL sur les données du projet Doremus (http://data.doremus.org) qui modélise et diffuse les données de création d'oeuvres musicales sur la base du modèle CIDOC-CRM / FRBRoo.
Slides de la Master Classe NodeJS : première édition faite le 27/09/2018 à Marseille
Couvre les aspects classiques (niveau débutant) de la création d'une application avec Node.
- Hello World bien sûr
- Faire des APIs avec Express
- Tester ses APIs
- Utiliser MongoDB
- Faire un client React => application MERN
- Quelques insights sur la sécurité avec Node
- Liens vers Github pour le code présenté
Retrouvez la lettre d'informations de ce mois de Mai.
Au programme :
- l'invention du mois avec Bioplumes
- Le concours Fab Life
- Le retour sur le RDV des innovations solidaires
Toujours disponible, jamais interrompu
Éclipse à été créé pour vous permettre de focaliser votre attention sur ce qui vous importe réellement sans jamais être interrompu par des notifications dont vous n'avez pas besoin instantanément.
http://minimaldisruption.fr
Invention à l'honneur : Fil Safe de Christine Chateau
Concours Tremplins I'NOV PRO 2017
MIE & Anabase : 2 associations pour vous aider dans la création d'entreprise.
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
SOLID est un acronyme représentant cinq principes de bases de la programmation orientée objet permettant le développement de logiciels fiables, évolutifs et robustes. Le framework Symfony est un excellent support pour illustrer chacun de ces principes. Nous verrons ainsi que SOLID est à l’origine de sa flexibilité, sa fiabilité mais aussi de sa maintenabilité et son évolutivité. Nous verrons également comment appliquer ces principes pour améliorer son code métier et perfectionner l’architecture de son application.
Sécurisation de vos applications web à l’aide du composant Security de SymfonyVladyslav Riabchenko
L'authentification et l’autorisation sont omniprésents dans les applications web. Cependant la sécurisation des applications Symfony semble assez compliquée surtout pour les débutants. Je vous propose d'examiner le composant Security de Symfony pour comprendre comment la couche d'authentification est organisée et comment les règles d'autorisation sont implémentées. Nous verrons les classes qui se cachent derrière la configuration dans votre security.yml.
Sécurisation de vos applications web à l’aide du composant Security de SymfonyVladyslav Riabchenko
Présentation pour meetup d'AFUP : https://www.meetup.com/fr-FR/afup-paris-php/events/253944518/
Le code : https://github.com/vria/symfony-security-component-use
Intervention sur le versionning sémantique et contraintes de versions dans composer.json pour la soirée de veille technologique à Webnet le 28/11/2017.
This document summarizes an presentation about dependency injection in Symfony 3.3 or greater. It discusses the service container and how it is used to instantiate services and inject their dependencies. It covers how to configure services and their dependencies, including using autowiring to simplify configuration. It also discusses autoconfiguring services as forms or commands. Finally, it presents options like _defaults and grouped declarations that can reduce configuration size.
1. Présentation par Vlad RIABCHENKO
Les patrons de conception du composant Form
9
Mai 2017
2. Vlad RIABCHENKO
Web développeur chez
depuis 2016
http://vria.eu
P r e s e n t a t i o n
L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
2
3. 1 / Patrons de conception
P l a n
L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
2 / Composite, Abstract factory, Observer
3 / Il y en a encore plus
3
5. P a t r o n s d e c o n c e p t i o n – q u e s o n t - i l s ?
L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
est un arrangement de modules/classes
un concept d'architecture
un exemple générique de solution
récurrent
reconnu comme une bonne pratique
issu de l'expérience de concepteurs de logiciels
Un patron de conception :
qui est
5
6. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
Le formalisme est important. Chaque patron possède :
un nom
une description de la problématique à résoudre
une description de la solution : les éléments de la solution, leurs relations
une liste des conséquences possibles
P a t r o n s d e c o n c e p t i o n – q u e s o n t - i l s ?
6
7. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
Les patrons de conception :
Réduisent la complexité des algorithmes
Réduisent le couplage
Promeuvent la réutilisation – flexibilité
Favorisent (et parfois rendent possible) la testabilité – TDD
Evitent les doublons – DRY
P a t r o n s d e c o n c e p t i o n – q u e s o n t - i l s ?
7
9. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
aPicture
aPicture aSquare aLine
aText aLine aLine
...
draw
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
Représenter des hiérarchies partie-entier
Permettre aux clients de traiter uniformément tous les objets dans une structure hiérarchique
Permettre aux clients d’ignorer la différence entre des objets individuels et les compositions
d'objets
9
10. C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
10
11. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
11
12. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
12
13. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
setData()
submit()
isValid()
...
all()
add()
remove()
has()
get()
...
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
12
14. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
$form->getConfig()->getCompound()
$formBuilder->setCompound(true)
$resolver->setDefaults([
'compound' => true
]);
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
13
15. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
Type Compound ?
TextType (EmailType,
PasswordType, ...)
non
IntegerType non
FileType non
CollectionType oui
RepeatedType oui
ChoiceType (EntityType, ...) pareil que l’option “expanded”
DateType (DateTimeType,
DateIntervalType, ...)
false si ‘widget’ est ‘single_text‘,
true sinon
FormType oui
YourCustomType oui
Par défaut :
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
14
16. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
Error bubbling
Compound forms need a data mapper
Compound forms expect an array or NULL on submission
You cannot add children to a simple form. Maybe you should set the option "compound" to true?
C o m p o s i t e – T r a i t e r u n i f o r m é m e n t d e s
o b j e t s i n d i v i d u e l s e t l e u r s c o m p o s i t i o n s
15
18. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
Un système devrait être indépendant de la façon dont ses produits sont créés, composés et représentés.
Un système doit être configuré avec une de plusieurs familles de produits.
Vous souhaitez fournir une bibliothèque de classes de produits, et vous souhaitez révéler uniquement
leurs interfaces.
Une famille d'objets produits doit être utilisée conjointement, et vous devez garantir cette contrainte.
Fournit une interface pour créer des familles d'objets liés ou inter-dépendants sans avoir à
préciser la classe concrète à utiliser au moment de leur création.
$factory->createObject($arguments); //suffit
$factory->createLogger(); // MonologLogger ou log4phpLogger ou ...
$factory->createHandler(); // MonologHandlerInterface ou log4phpLoggerAppender ou …
$factory->create...();
A b s t r a c t F a c t o r y – C r é e r d e s f a m i l l e s d ' o b j e t s
s a n s c o n n a î t r e l e u r s c l a s s e s c o n c r è t e s
16
19. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
A b s t r a c t F a c t o r y – C r é e r d e s f a m i l l e s d ' o b j e t s
s a n s c o n n a î t r e l e u r s c l a s s e s c o n c r è t e s
$factory->createLogger(); //MonologLogger ou log4phpLogger ou ...
$factory->createHandler(); //MonologHandlerInterface ou log4phpLoggerAppender ou …
$factory->create...();
MonologFactory
Création déléguée
Plusieurs familles de produits
Seulement les objets d'une certaine famille
Organiser les familles en bibliothèques
log4phpFactory
$factory->createLogger(); //MonologLogger ou log4phpLogger ou ...
$factory->createHandler(); //MonologHandlerInterface ou log4phpLoggerAppender ou …
$factory->create...();
17
20. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
A b s t r a c t F a c t o r y – C r é e r d e s f a m i l l e s d ' o b j e t s
s a n s c o n n a î t r e l e u r s c l a s s e s c o n c r è t e s
AbstractFactory
$factory->createLogger(); //AbstractLogger ...
$factory->createHandler(); //AbstractHandler ...
$factory->create...();
AbstractLogger AbstractHandler
log4phpFactory
log4phpLogger
log4phpHandler
MonologFactory
MonologLogger
MonologHandler
18
21. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
A b s t r a c t F a c t o r y – C r é e r d e s f a m i l l e s d ' o b j e t s
s a n s c o n n a î t r e l e u r s c l a s s e s c o n c r è t e s
19
22. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
A b s t r a c t F a c t o r y – C r é e r d e s f a m i l l e s d ' o b j e t s
s a n s c o n n a î t r e l e u r s c l a s s e s c o n c r è t e s
$container->get('form.factory')->createForm(...);
$this->createForm(...); //dans Controller
$form->getConfig()->getFormFactory()->createForm();
my_service:
class: FQCNClassName
arguments: ['@form.factory']
20
24. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
Lorsqu’un objet doit notifier aux autres un événement à la suite d’une action quelconque (modèle
“publish-subscribe”).
Crée une communication abstraite entre un observable (subject) et des observateurs :
Permet l’exécution de code dans le package A (B, C, ...) à un certain moment d’éxécution de code
dans le package réutilisable Z.
// Des observers peuvent s'attacher a un observable
$observable->addObserver($observer1);
$observable->addObserver($observer2);
// un observable peut notifier des observers
$observable1->notify($data);
$observable2->notify($data);
21
25. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
22
26. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
interface SplObserver {
abstract public void update(SplSubject $subject)
}
Interface SplSubject {
abstract public void attach(SplObserver $observer)
abstract public void detach(SplObserver $observer)
abstract public void notify(void)
}
Prêt-à-implémenter :
23
27. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
Distinguer les évenements
app.my_exception_listener:
class: ExceptionListener
tags:
- {name: kernel.event_listener, event: kernel.exception}
/**
* @ORMPrePersist
*/
public function setCreatedAtValue()
{ ... }
$formBuilder->addEventListener(FormEvents::PRE_SUBMIT, $listener);
24
28. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
Passer de l'information utile aux observers lors de l'appel
class ExceptionListener {
public function onKernelException(GetResponseForExceptionEvent $event)
{ ... }
}
$listener = function (FormEvent $event) {
...
};
/**
* @ORMPrePersist
*/
public function setCreatedAtValue(LifecycleEventArgs $args)
{ ... }
25
29. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
26
Formulaire
initialisé
navigateur
Formulaire
vide
PRE_SET_DATA
POST_SET_DATA
Transformers
Formulaire
vide ou initialisé
PRE_SUBMIT
SUBMIT
view-to-norm transformer
SUBMIT
norm-to-view transformer,
norm-to-model transformer
Données envoyées
Données de modèle
30. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
PRE_SET_DATA
Modifier les données fournies pendant la pré-
population
Modifier le formulaire en fonction des données
pré-peuplées
Début
Form::setData()
ResizeFormListener
27
navigateur
31. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
PRE_SET_DATA
Modifier les données fournies pendant la pré-
population
Modifier le formulaire en fonction des données
pré-peuplées
POST_SET_DATA
Accéder aux données transformées (normalisées,
view)
Début
Form::setData()
Fin
Form::setData()
ResizeFormListener
DataCollectorListener
navigateur
27
32. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
PRE_SET_DATA
Modifier les données fournies pendant la pré-
population
Modifier le formulaire en fonction des données
pré-peuplées
POST_SET_DATA
Accéder aux données transformées (normalisées,
view)
PRE_SUBMIT
Changer les données de Request avant de
soumettre les données au formulaire
Ajouter ou supprimer des champs de formulaire,
avant de soumettre les données au formulaire
Début
Form::setData()
Fin
Form::setData()
Début de
Form::submit()
ResizeFormListener
DataCollectorListener
TrimListener
CsrfValidationListener
ResizeFormListener
navigateur
27
33. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
PRE_SET_DATA
Modifier les données fournies pendant la pré-
population
Modifier le formulaire en fonction des données
pré-peuplées
POST_SET_DATA
Accéder aux données transformées (normalisées,
view)
PRE_SUBMIT
Changer les données de Request avant de
soumettre les données au formulaire
Ajouter ou supprimer des champs de formulaire,
avant de soumettre les données au formulaire
SUBMIT
Mêmes que pour PRE_SUBMIT
Modifier les données normalisées
Début
Form::setData()
Fin
Form::setData()
Début de
Form::submit()
Données de
Request sont
normalisé
ResizeFormListener
DataCollectorListener
TrimListener
CsrfValidationListener
ResizeFormListener
FixUrlProtocolListener
navigateur
27
34. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
O b s e r v e r – N o t i f i e r d e s é v è n e m e n t s d i v e r s
PRE_SET_DATA
Modifier les données fournies pendant la pré-
population
Modifier le formulaire en fonction des données
pré-peuplées
POST_SET_DATA
Accéder aux données transformées (normalisées,
view)
PRE_SUBMIT
Changer les données de Request avant de
soumettre les données au formulaire
Ajouter ou supprimer des champs de formulaire,
avant de soumettre les données au formulaire
SUBMIT
Mêmes que pour PRE_SUBMIT
Modifier les données normalisées
POST_SUBMIT
Mêmes que pour PRE_SUBMIT
Modifier les données normalisées
Début
Form::setData()
Fin
Form::setData()
Début de
Form::submit()
Données de
Request sont
normalisé
Fin de
Form::submit()
ResizeFormListener
DataCollectorListener
TrimListener
CsrfValidationListener
ResizeFormListener
FixUrlProtocolListener
ValidationListener
DataCollectorListener
navigateur
27
36. L e s p a t r o n s d e c o n c e p t i o n d u
c o m p o s a n t F o r m
I l y e n a e n c o r e p l u s
Adapter : ResolvedFormType, FormType
Bridge: FormRenderer
Builder: FormBuilderInterface (FormBuilder, SubmitButtonBuilder, ButtonBuilder) et
FormConfigBuilderInterface (FormConfigBuilder)
Facade: Forms
Factory method: ResolvedFormType::createBuilder
Chain of responsibility: Form::setError
28
37. R ETR OU VEZ W EBN ET
Merci
pour votre attention