SYMF0NY3
Alexandre Bacco
Fabien Potencier
Eyrolles
Introduction
1
Première partie - Vue d'ensemble de Symfony3
1 Symfony, un framework PHP
5
Qu'est-ce qu'un framework ?6
L'objectif d'un framework
6
Définition
6
Objectif d'un framework
6
Pesons le pour et le contre
7
Alors, convaincus ?
8
Qu'est-ce que Symfony ?8
Un framework
8
Un framework populaire
8
Un framework populaire et français
9
Qu'est-il possible de faire avec Symfony ?
9
Télécharger Symfony10
Vérifier l'installation de PHP en console
10
Obtenir Symfony
11
Droits d'accès
13
En résumé14
2 Vous avez dit Symfony ?
15
L'architecture des fichiers15
Liste des répertoires
15
Le répertoire /app
16
Le répertoire /bin
16
Le répertoire /src
16
Le répertoire /tests
16
Le répertoire /var
16
Le répertoire /vendor
16
Le répertoire /web
17
À retenir
17
Le contrôleur frontal
17
L'architecture conceptuelle20
Architecture MVC
20
Parcours d'une requête dans Symfony
21
Symfony et ses bundles
23
La découpe en bundles
23
L'intérêt
23
La bonne pratique
24
Les bundles de la communauté
24
La structure d'un bundle
25
En résumé25
3 Utilisons la console pour créer un bundle
27
Utilisation de la console27
Sous Windows
27
Sous Linux et Mac
28
À quoi cela sert-il ?
28
Comment cela marche-t-il ?
29
Le fil rouge de notre cours : une plate-forme d'échange30
Créons notre bundle30
Tout est bundle
30
Exécuter la bonne commande
30
Que s'est-il passé ?
33
Pour conclure
36
En résumé36
Deuxième partie - Les bases de Symfony37
4 Mon premier « Hello World ! » avec Symfony
39
Créer sa route39
Quel est le rôle du routeur ?
39
Créer son fichier de routes
40
Informer Symfony que nous avons des routes pour lui
41
Créer son contrôleur41
Quel est le rôle du contrôleur ?
41
Notre propre contrôleur
42
Créer son template Twig43
Les templates avec Twig
43
Utiliser Twig avec Symfony
44
L'objectif : créer une plate-forme d'annonces47
Un peu de nettoyage48
Schéma de développement sous Symfony48
Pour conclure49
En résumé50
5 Le routeur de Symfony
51
Le fonctionnement51
Fonctionnement du routeur
52
Convention pour le nom du contrôleur
54
Les routes de base54
Créer une route
54
Créer une route avec des paramètres
55
Les routes avancées57
Créer une route avec des paramètres et leurs contraintes
57
Utiliser des paramètres facultatifs
58
Utiliser des « paramètres système »
59
Ajouter un préfixe lors de l'import de nos routes
60
Générer des URL61
Pourquoi générer des URL ?
61
Comment générer des URL ?
61
Application : les routes de notre plate-forme63
Page d'accueil
63
Page de visualisation d'une annonce
63
Ajout, modification et suppression
64
Récapitulatif
64
Pour conclure65
En résumé66
6 Les contrôleurs avec Symfony
67
Le rôle du contrôleur67
Retourner une réponse
67
Manipuler l'objet Request69
Les paramètres de la requête
69
Les autres méthodes de l'objet Request
72
Savoir si la requête est une requête Ajax
72
Manipuler l'objet Response73
Décomposition de la construction d'un objet Response
73
Réponses et vues
73
Réponse et redirection
75
Changer le Content-type de la réponse
77
Manipuler la session78
Application : le contrôleur de notre plate-forme81
À retenir83
L'erreur 404
83
La définition des méthodes
83
Tester les types d'erreurs
84
Pour conclure85
En résumé85
7 Le moteur de templates Twig
87
Les templates Twig87
Intérêt
87
Des pages web, mais aussi des e-mails et autres
88
En pratique
88
À savoir
89
Afficher des variables89
Syntaxe élémentaire pour afficher des variables
89
Précisions sur la syntaxe {{ objet.attribut }}
90
Les filtres utiles
90
Twig et la sécurité
91
Les variables globales
92
Structures de contrôle et expressions93
Les structures de contrôle
93
Les tests utiles
95
Hériter et Inclure des templates96
L'héritage de template
96
L'inclusion de templates
100
L'inclusion de contrôleurs
101
Application : les templates de notre plate-forme103
Layout général
104
Layout du bundle
106
Les templates finaux
106
Pour conclure113
En résumé114
8 Installer un bundle grâce à Composer
115
Composer, qu'est-ce que c'est ?115
Un gestionnaire de dépendances
115
Comment Composer sait-il où trouver les bibliothèques ?
116
Un outil innovant... dans l'écosystème PHP
116
Concrètement, comment fonctionne Composer ?
116
Installer Composer et Git116
Installer Composer
116
Installer Git
117
Installer un bundle grâce à Composer118
Manipulons Composer
118
Mettons à jour Symfony
120
Installer un bundle avec Composer
121
Gérer manuellement l'autoload d'une bibliothèque
123
Pour conclure124
En résumé124
9 Les services, théorie et création
125
Pourquoi utiliser des services ?125
Genèse
125
Qu'est-ce qu'un service ?
126
L'avantage de la programmation orientée services
126
Le conteneur de services
126
Comment définir les dépendances entre services ?
129
Le partage des services
129
Utiliser un service en pratique130
Créer un service simple131
Créer la classe du service
131
Configurer le service
132
Utiliser le service
134
Créer un service avec des arguments135
Injecter des arguments dans nos services
135
Injecter des dépendances
137
Aperçu du code
137
Pour conclure138
En résumé139
Troisième partie - Gérer la base de données avec Doctrine2141
10 La couche métier : les entités
143
Notions d'ORM : utiliser des objets à la place des requêtes143
Créer une première entité avec Doctrine2144
Une entité, c'est juste un objet
144
Une entité, c'est juste un objet... mais avec des commentaires !
145
Créer une entité : le générateur à la rescousse !
147
Affiner notre entité avec de la logique métier
149
À retenir
150
Tout sur le mapping !151
L'annotation Entity
151
L'annotation Table
151
L'annotation Column
152
Pour conclure154
En résumé155
11 Manipuler ses entités avec Doctrine2
157
Matérialiser les tables en base de données157
Créer la table correspondante dans la base de données
157
Modifier une entité
159
À retenir
160
Utiliser le gestionnaire d'entités161
Les services Doctrine2
161
Les repositories
162
Enregistrer ses entités en base de données
164
Doctrine utilise les transactions
166
Doctrine simplifie la vie
166
Les autres méthodes utiles du gestionnaire d'entités
167
Récupérer ses entités avec un repository168
En résumé170
12 Les relations entre entités avec Doctrine2
171
Notions de base sur les relations171
Entité propriétaire et entité inverse
171
Relations unidirectionnelle et bidirectionnelle
172
Relations et requêtes
172
Relation One-To-One173
Présentation
173
Définir la relation dans les entités
174
Exemple d'utilisation
178
Relation Many-To-One180
Présentation
180
Définir la relation dans les entités
183
Exemple d'utilisation
185
Relation Many-To-Many187
Présentation
187
Définir la relation dans les entités
188
Remplir la base de données avec les fixtures
191
Exemples d'utilisation
192
Relation Many-To-Many avec attributs197
Présentation
197
Définir la relation dans les entités
198
Remplir la base de données
201
Exemple d'utilisation
202
Les relations bidirectionnelles206
Présentation
206
Définir la relation dans les entités
206
Pour conclure211
En résumé211
13 Récupérer ses entités avec Doctrine2
213
Le rôle des repositories213
Définition
213
Construire ses requêtes pour récupérer des entités
214
Les méthodes de récupération de base215
Définition
215
Les méthodes classiques
215
Les méthodes magiques
217
Les méthodes personnelles de récupération218
La théorie
218
Le QueryBuilder
218
La Query
223
Utiliser le Doctrine Query Language (DQL)
226
Utiliser les jointures dans les requêtes228
Pourquoi utiliser les jointures ?
228
Comment faire des jointures avec le QueryBuilder ?
228
Comment utiliser les jointures ?
230
Application : les repositories de notre plate-forme d'annonces231
Plan d'attaque
231
À vous de jouer !
231
La correction
232
En résumé233
14 Les événements et extensions Doctrine
235
Les événements Doctrine235
L'intérêt des événements Doctrine
235
Définir des callbacks de cycle de vie
236
Liste des événements de cycle de vie
238
Un autre exemple d'utilisation
239
Utiliser des services pour écouter les événements Doctrine
241
Essayons nos événements
244
Les extensions Doctrine246
L'intérêt des extensions Doctrine
246
Installer le StofDoctrineExtensionBundle
246
Utiliser une extension : l'exemple de Sluggable
247
Liste des extensions Doctrine
249
Pour conclure250
En résumé250
15 TP : consolidation de notre code
251
Synthèse des entités251
Entité Advert
251
Entité Image
257
Entité Application
258
Entité Category
260
Entités Skill et AdvertSkill
261
Et bien sûr
263
Adaptation du contrôleur263
Théorie
263
Pratique
264
Utiliser des jointures267
Paginer des annonces sur la page d'accueil269
Pour conclure272
En résumé273
Quatrième partie - Aller plus loin avec Symfony275
16 Créer des formulaires avec Symfony
277
Gérer des formulaires277
L'enjeu des formulaires
277
Qu'est-ce qu'un formulaire Symfony ?
278
Gérer simplement un formulaire
279
Ajouter des champs
282
Gérer de la soumission d'un formulaire
284
Gérer les valeurs par défaut du formulaire
287
Personnaliser l'affichage d'un formulaire
288
Créer des types de champs personnalisés
291
Externaliser la définition de ses formulaires291
Définir le formulaire dans AdvertType
291
Le contrôleur épuré
292
Les formulaires imbriqués294
Intérêt de l'imbrication
294
Un formulaire est un champ
294
Relation simple : imbriquer un seul formulaire
295
Relation multiple : imbriquer un même formulaire plusieurs fois
297
Un type de champ très utile : entity
303
L'option query_builder
305
Aller plus loin avec les formulaires307
L'héritage de formulaire
307
À retenir
308
Varier la méthode de construction d'un formulaire
308
Envoyer des fichiers avec le type de champ File311
Le type de champ File
311
Préparer l'objet sous-jacent
311
Adapter le formulaire
312
Manipuler le fichier envoyé
313
Automatiser le traitement grâce aux événements
315
Application : les formulaires de notre site320
Théorie
320
Pratique
320
Pour conclure326
En résumé326
17 Valider ses données
327
Pourquoi valider des données ?327
Toujours se méfier des données de l'utilisateur
327
L'intérêt de la validation
327
La théorie de la validation
328
Définir les règles de validation328
Les différents formats de règles
328
Déclencher la validation334
Le service validator
334
La validation automatique sur les formulaires
335
Encore plus de règles de validation336
Valider depuis un accesseur
336
Valider intelligemment un attribut objet
337
Valider depuis un Callback
338
Valider un champ unique
339
Valider selon nos propres contraintes340
Créer la contrainte
341
Créer le validateur
342
Transformer son validateur en service
344
Définition du service
344
Modifier la contrainte
345
Modifier du validateur
345
Pour conclure347
En résumé347
18 Sécurité et gestion des utilisateurs
349
Authentification et autorisation349
L'authentification
349
L'autorisation
350
Exemples
350
Processus général
353
Première approche de la sécurité354
Le fichier de configuration de la sécurité
354
Mettre en place un pare-feu
357
Les erreurs courantes
363
Depuis le contrôleur ou un service
364
Depuis une vue Twig
365
Gérer des autorisations avec les rôles365
Définition des rôles
366
Tester les rôles de l'utilisateur
367
Pour conclure sur les méthodes de sécurisation
370
Gérer des utilisateurs avec la base de données370
Qui sont les utilisateurs ?
370
Créons notre classe d'utilisateurs
371
Créer des utilisateurs de test
372
Définir l'encodeur pour la nouvelle classe d'utilisateurs
373
Définir le fournisseur d'utilisateurs
374
Demander au pare-feu d'utiliser le nouveau fournisseur
375
Manipuler les utilisateurs
375
Utiliser FOSUserBundle376
Installer FOSUserBundle
376
Hériter FOSUserBundle depuis le OCUserBundle
377
Modifier notre entité User
378
Configurer le bundle
379
Mettre à jour la table User
380
Configurer la sécurité pour utiliser le bundle
380
Configurer le fonctionnement de FOSUserBundle
382
Manipuler les utilisateurs avec FOSUserBundle
386
Pour conclure386
En résumé387
19 Les services : fonctions avancées
389
Les tags sur les services389
Les tags
389
Comprendre les tags à travers Twig
389
Appliquer un tag à un service
390
Une classe qui implémente une interface
391
Écrire le code qui sera exécuté
392
Méthodologie
393
Les principaux tags
394
Les événements du coeur
394
Les types de champs de formulaire
394
Dépendances optionnelles : les appels de méthodes (calls)396
Les dépendances optionnelles
396
Les appels de méthodes (calls)
397
L'utilité des appels de méthodes
397
Les services courants de Symfony398
En résumé400
20 Le gestionnaire d'événements de Symfony
401
Des événements ? Pour quoi faire ?401
Qu'est-ce qu'un événement ?
401
Qu'est-ce que le gestionnaire d'événements ?
402
Écouter tes événements403
Notre exemple
403
Créer un service et son écouteur
403
Écouter un événement
405
Créer la méthode à exécuter de l'écouteur
408
Méthodologie
411
Les événements Symfony... et les nôtres !412
Les événements Symfony
412
Créer ses propres événements
417
Allons un peu plus loin423
Les souscripteurs d'événements
423
L'ordre d'exécution des écouteurs
425
La propagation des événements
426
En résumé427
21 Traduire son site
429
Introduction à la traduction429
Le principe
429
Traduire avec Symfony
430
Prérequis
431
Configuration
431
Mettre en place une page de test
432
Bonjour le monde433
Le filtre Twig {{ 'string'\trans }}
433
La balise de bloc Twig {% trans %}
433
Le service translator
434
Notre vue
435
Le catalogue435
Les formats de catalogue
436
La mise en cache du catalogue
437
Notre traduction
438
Ajouter un nouveau message à traduire
438
Extraire les chaînes sources d'un site existant
438
Traduire dans une nouvelle langue
440
Récupérer la locale de l'utilisateur440
Déterminer la locale
440
Routing et locale
441
Organiser vos catalogues443
Utiliser des mots-clés plutôt que du texte comme chaînes sources
444
Nicher les traductions
445
Permettre le retour à la ligne au milieu des chaînes cibles
446
Utiliser des listes
447
Utiliser les domaines
448
Domaines et bundles
449
Un domaine spécial : validators
449
Traductions dépendant de variables450
Les placeholders
450
Les placeholders dans le domaine validators
451
Gérer les pluriels
452
Afficher des dates au format local
453
Pour conclure456
En résumé457
Cinquième partie - Préparer la mise en ligne459
22 Convertir les paramètres de requêtes
461
Théorie : pourquoi convertir des paramètres ?461
Récupérer des entités Doctrine avant même le contrôleur
461
Les convertisseurs de paramètres
462
Un convertisseur utile : DoctrineParamConverter
462
Un peu de théorie sur les convertisseurs
462
Pratique : utiliser les convertisseurs existants463
Utiliser le convertisseur Doctrine
463
Utiliser le convertisseur Datetime
467
Aller plus loin : créer ses propres convertisseurs468
Comment sont exécutés les convertisseurs ?
468
Comment Symfony trouve-t-il tous les convertisseurs ?
468
Créer un convertisseur
469
L'exemple de notre JsonParamConverter
470
En résumé472
23 Personnaliser les pages d'erreur
473
Théorie : remplacer les vues d'un bundle473
Constater les pages d'erreur
473
Localiser les vues concernées
474
Remplacer les vues d'un bundle
474
Comportement de Twig
475
Pourquoi tous ces formats error.XXX.twig dans le répertoire Exception ?
475
Pratique : remplacer les templates Exception de TwigBundle476
Créer la nouvelle vue
476
Le contenu d'une page d'erreur
476
En résumé477
24 Utiliser Assetic pour gérer les codes CSS et JS de votre site
479
Théorie : entre vitesse et lisibilité, pourquoi choisir ?479
À propos du nombre de requêtes HTTP d'une page web
479
Comment optimiser le front-end ?
480
Améliorer le temps de chargement !
480
En action !
480
Conclusion
481
Pratique : Assetic à la rescousse !481
Installer Assetic et les bibliothèques de compression
481
Servir des ressources
482
Modifier les ressources servies
484
Gérer le mode prod
486
Comprendre Assetic
486
Exporter ses fichiers CSS et JS
487
Et bien plus encore
488
En résumé488
25 Utiliser la console depuis le navigateur
489
Théorie : le composant Console de Symfony489
Les commandes sont en PHP
489
Exemple d'une commande
490
Pratique : utiliser un ConsoleBundle491
ConsoleBundle ?
491
Télécharger CoreSphereConsoleBundle
492
Enregistrer le bundle dans le kernel
493
Enregistrer les routes
493
Publier les assets
494
Utiliser la console dans son navigateur
494
Prêts pour l'hébergement mutualisé
494
En résumé494
26 Déployer son site Symfony en production
495
Préparer son application en local495
Vider le cache, tout le cache
495
Tester l'environnement de production
496
Soigner ses pages d'erreur
496
Installer une console sur navigateur
497
Vérifier la qualité de votre code
497
Vérifier la sécurité de vos dépendances
498
Vérifier et préparer le serveur de production499
Vérifier la compatibilité du serveur
499
Déployer votre application501
Méthode 1 : envoyer les fichiers sur le serveur par FTP
501
Méthode 2 : utiliser l'outil Capifony pour envoyer votre application
502
Les derniers préparatifs502
S'autoriser l'environnement de développement
503
Mettre en place la base de données
503
S'assurer que tout fonctionne
504
Avoir de belles URL
504
Et profitez !
505
Les mises à jour de la base de données
506
Une checklist pour vos déploiements
506
En résumé507
Index
509