Installer Symfony et découvrir la structure du projet
Découvrir le framework Symfony
Facile
00:02:12
Choisir entre Symfony CLI et Composer pour installer Symfony
Facile
00:03:44
Créer le projet PostFlow avec composer create-project et webapp
Facile
00:02:51
Parcourir l'arborescence d'un projet Symfony : de assets à public
Facile
00:03:29
Parcourir l'arborescence d'un projet Symfony : de src au fichier .env
Facile
00:05:00
Lister les commandes disponibles avec php bin/console
Facile
00:02:19
Contrôleurs, routes et premiers templates Twig
Comprendre le rôle du contrôleur dans le modèle MVC
Facile
00:03:20
Générer un contrôleur avec make:controller
Facile
00:02:15
Définir une route avec l'attribut #[Route] et appeler render()
Facile
00:03:07
Écrire la syntaxe Twig et afficher la page avec symfony serve
Facile
00:04:57
Comprendre config/routes.yaml et config/packages/framework.yaml
Facile
00:04:01
Comprendre Request et Response avec HttpFoundation
Facile
00:04:15
Lire les paramètres d'URL avec $request->query->get()
Facile
00:05:44
Transmettre des variables d'un contrôleur à un template Twig
Facile
00:04:10
Appliquer un filtre Twig et consulter la référence Twig
Facile
00:04:12
Générer des liens avec les fonctions Twig path() et url()
Facile
00:04:01
Déboguer avec dump() dans Twig et la barre de débogage
Facile
00:04:45
Doctrine ORM, entités et énumérations PHP
Comprendre Doctrine ORM et le mapping objet-relationnel
Moyen
00:03:45
Configurer DATABASE_URL et créer la base avec doctrine:database:create
Moyen
00:05:41
Modéliser PostFlow et choisir une enum PHP pour les statuts
Moyen
00:05:05
Créer l'énumération backed StatutColis
Moyen
00:06:33
Ajouter une méthode label() avec match dans une enum
Moyen
00:05:20
Préparer les choix de formulaire avec la méthode statique choices()
Moyen
00:04:44
Extraire les valeurs techniques d'une enum avec array_map
Moyen
00:03:51
Associer une classe de badge Bootstrap à chaque statut
Moyen
00:05:52
Ajouter une méthode isFinal() à l'énumération
Moyen
00:02:18
Créer l'entité Agence avec make:entity
Moyen
00:05:07
Ajouter des propriétés string et boolean avec make:entity
Moyen
00:03:15
Modifier une entité à la main et vérifier avec doctrine:mapping:info
Moyen
00:03:28
Valider les données des entités
Comprendre les contraintes de validation d'une entité
Moyen
00:03:24
Valider le nom avec les contraintes Length et NotBlank
Moyen
00:06:18
Valider le code postal avec la contrainte Regex
Moyen
00:06:19
Ajouter NotBlank, Regex et Length sur la ville
Moyen
00:05:58
Contraindre l'adresse et initialiser les propriétés de l'entité
Moyen
00:03:41
Créer une relation ManyToOne Client → Agence avec make:entity
Moyen
00:05:51
Ajouter les contraintes NotBlank et Length au nom du client
Moyen
00:03:02
Limiter la longueur de l'e-mail avec Length et {{ limit }}
Moyen
00:04:04
Valider le format de l'e-mail avec Assert\Email et {{ value }}
Moyen
00:05:40
Valider un téléphone français avec la contrainte Regex
Moyen
00:05:12
Valider adresse, ville et code postal et initialiser les chaînes
Moyen
00:03:31
Relations entre entités et migrations
Compléter la relation avec inversedBy et JoinColumn(nullable: false)
Moyen
00:03:29
Définir le côté OneToMany avec Collection et mappedBy
Moyen
00:06:27
Créer l'entité Colis : numéro de suivi, statut et destinataire
Moyen
00:04:52
Ajouter adresse de livraison, poids et createdAt au Colis
Moyen
00:04:24
Relier le Colis au client et à l'agence de dépôt en ManyToOne
Moyen
00:04:38
Vérifier le code généré des relations dans Colis et Agence
Moyen
00:02:31
Générer et exécuter une migration avec make:migration
Moyen
00:04:55
Choisir le moteur InnoDB pour gérer les clés étrangères
Moyen
00:02:59
Contrôler le schéma avec schema:update et schema:validate
Moyen
00:04:28
Contrôleur, repository et liste en Twig
Créer AgenceController avec make:controller
Moyen
00:05:02
Préfixer les routes et leurs noms au niveau de la classe
Moyen
00:03:21
Injecter Request et AgenceRepository dans l'action index
Moyen
00:02:16
Rechercher avec method_exists et findBy puis transmettre items
Moyen
00:05:45
Créer la page index Twig avec un formulaire de recherche
Moyen
00:05:32
Construire un tableau Bootstrap pour lister les agences
Moyen
00:02:44
Déboguer les données du contrôleur avec dd()
Moyen
00:03:10
Parcourir les agences avec la boucle for de Twig
Moyen
00:04:12
Ajouter les liens d'action et tester la recherche
Moyen
00:04:43
Récapituler le rôle du contrôleur et du repository
Moyen
00:03:09
Créer le CRUD et ses formulaires
Lister les routes avec debug:router et déclarer la route new
Moyen
00:04:57
Injecter l'EntityManagerInterface dans la méthode new
Moyen
00:03:03
Créer le template du formulaire et instancier une nouvelle entité
Moyen
00:03:25
Créer le formulaire dans le contrôleur avec createForm()
Moyen
00:03:21
Traiter la soumission avec handleRequest, persist et flush
Moyen
00:03:40
Ajouter un message flash, rediriger et rendre le formulaire
Moyen
00:03:01
Afficher le formulaire avec form_start, form_widget et form_end
Moyen
00:03:20
Choisir entre form() et le rendu décomposé d'un formulaire Twig
Moyen
00:04:43
Ajouter le bouton d'envoi et un lien retour avec path()
Moyen
00:05:22
Déclarer le bouton avec SubmitType et tester la création
Moyen
00:05:27
Créer la méthode show avec l'entité en paramètre de route
Moyen
00:04:40
Afficher le détail d'une agence dans show.html.twig
Moyen
00:04:19
Créer la méthode edit pour modifier une agence
Moyen
00:05:30
Créer la méthode delete limitée à la méthode POST
Moyen
00:03:38
Vérifier le jeton CSRF puis supprimer avec remove() et flush()
Moyen
00:04:43
Ajouter le lien Modifier et le formulaire de suppression dans Twig
Moyen
00:04:16
Sécuriser la suppression avec une confirmation et un jeton CSRF
Moyen
00:05:28
Requêtes du repository et formulaire client
Joindre l'entité Agence dans ClientRepository avec leftJoin
Moyen
00:02:28
Filtrer les clients par mot-clé avec andWhere et setParameter
Moyen
00:02:46
Compter les clients par ville avec select et COUNT
Moyen
00:04:24
Grouper et limiter avec groupBy, setMaxResults et getArrayResult
Moyen
00:03:47
Générer ClientType avec make:form et configurer le champ nom
Moyen
00:04:34
Configurer les champs email et téléphone avec EmailType et TelType
Moyen
00:04:06
Configurer les champs adresse avec inputmode et autocomplete
Moyen
00:05:12
Configurer le champ agenceReference avec EntityType
Moyen
00:05:06
Filtrer les agences actives avec l'option query_builder
Moyen
00:06:50
Formater le texte de la liste déroulante avec choice_label et sprintf
Moyen
00:04:38
Requêtes avancées avec le QueryBuilder
Trier et filtrer une recherche texte dans le QueryBuilder
Difficile
00:03:26
Combiner des conditions avec expr()->orX() et LIKE
Difficile
00:04:23
Filtrer par statut avec un paramètre enum dans le QueryBuilder
Difficile
00:02:16
Filtrer par ville et exécuter la requête avec getResult()
Difficile
00:04:10
Compter les colis par statut avec select, groupBy et orderBy
Difficile
00:06:35
Récupérer les derniers colis avec setMaxResults()
Difficile
00:04:49
Préparer une méthode de recherche des colis en incident
Difficile
00:03:51
Calculer une date limite et filtrer statut et date avec andWhere()
Difficile
00:06:11
Passer les paramètres et trier les colis en incident
Difficile
00:03:09
Regrouper les données du tableau de bord dans une méthode
Difficile
00:02:37
Formulaires du colis et du suivi
Générer ColisType avec make:form et configurer le numéro de suivi
Moyen
00:05:21
Configurer un champ EnumType avec choice_label et placeholder
Moyen
00:06:19
Configurer les champs texte du destinataire et de l'adresse
Moyen
00:03:20
Configurer la ville et le code postal avec inputmode
Moyen
00:02:44
Configurer un champ NumberType avec scale et html5
Moyen
00:03:44
Ajouter des attributs HTML et row_attr à un champ de formulaire
Moyen
00:03:47
Exclure createdAt et configurer l'agence et le client avec EntityType
Moyen
00:07:14
Générer MouvementColisType pour tracer les changements de statut
Moyen
00:05:19
Configurer les champs statut et lieu de MouvementColisType
Moyen
00:05:09
Configurer un champ TextareaType facultatif
Moyen
00:05:05
Services et injection de dépendances
Comprendre les services et le conteneur de Symfony
Moyen
00:06:20
Comprendre l'injection de dépendances et l'autowiring
Moyen
00:05:59
Lister les services disponibles avec debug:autowiring
Moyen
00:02:09
Déléguer la logique métier à un service plutôt qu'au contrôleur
Moyen
00:05:03
Créer TrackingService et injecter EntityManagerInterface
Moyen
00:06:03
Mettre à jour le statut et persister un MouvementColis
Moyen
00:04:33
Générer ColisController avec make:controller
Moyen
00:03:49
Valider le statut reçu en requête avec StatutColis::tryFrom()
Moyen
00:03:15
Appeler la méthode rechercher() du repository depuis l'index
Moyen
00:04:35
Transmettre les statuts et les filtres saisis à la vue Twig
Moyen
00:05:49
Interface des colis : liste, filtres et formulaire
Construire l'en-tête de la liste des colis avec Bootstrap
Moyen
00:04:16
Créer un formulaire de recherche GET dans un template Twig
Moyen
00:05:43
Ajouter les champs ville et statut au formulaire de recherche
Moyen
00:03:45
Générer les options d'un select avec une boucle for et selected
Moyen
00:03:47
Ajouter un bouton de soumission au formulaire de filtre
Moyen
00:02:35
Ajouter un lien de réinitialisation et une carte d'affichage
Moyen
00:05:35
Construire le tableau Bootstrap de la liste des colis en Twig
Moyen
00:04:47
Afficher les colonnes d'un colis et le badge de statut dans la boucle
Moyen
00:04:32
Ajouter les boutons d'action et le bloc else d'une boucle for Twig
Moyen
00:05:05
Écrire l'action new du ColisController avec un message flash sprintf
Moyen
00:06:02
Créer le template du formulaire de colis et son en-tête
Moyen
00:02:56
Utiliser le filtre Twig default pour une valeur non définie
Moyen
00:02:58
Adapter le titre création/modification et ajouter un lien de retour
Moyen
00:04:54
Structurer un formulaire avec form_start, form_errors et form_row
Moyen
00:05:42
Disposer les champs client, agence et livraison avec form_row
Moyen
00:05:33
Disposer code postal et ville, puis ajouter le lien Annuler
Moyen
00:03:31
Ajouter le bouton de soumission conditionnel et form_end
Moyen
00:03:55
Tester la création d'un colis depuis le formulaire
Moyen
00:02:37
Restreindre l'action show à GET/POST et injecter TrackingService
Moyen
00:04:20
Créer un MouvementColis et son formulaire dans l'action show
Moyen
00:02:57
Appeler TrackingService pour changer le statut d'un colis
Moyen
00:04:51
Ajouter le message flash et rediriger vers le détail du colis
Moyen
00:05:13
Créer le template de détail d'un colis avec badge de statut
Moyen
00:05:54
Sécurité : l'entité User et sa validation
Créer l'entité User de sécurité avec make:user
Moyen
00:04:50
Explorer les fichiers générés et ajouter un champ nom à User
Moyen
00:03:20
Ajouter UniqueEntity et des constantes de rôles à l'entité User
Moyen
00:05:35
Valider l'email avec NotBlank, Email et Length
Moyen
00:05:24
Valider le tableau des rôles avec NotNull, All et Choice
Moyen
00:04:48
Personnaliser le message de Choice avec {{ value }}
Moyen
00:02:35
Valider le nom avec Length et Regex
Moyen
00:03:28
Normaliser l'email et dédoublonner les rôles dans les setters
Moyen
00:03:08
Comprendre les authenticators et le hachage des mots de passe
Moyen
00:02:58
Authentification et contrôle d'accès
Générer le formulaire de connexion avec make:security:form-login
Difficile
00:03:17
Configurer default_target_path, la déconnexion et access_control
Difficile
00:04:15
Préparer la création d'un utilisateur admin dans un contrôleur
Difficile
00:04:26
Hacher le mot de passe avec hashPassword et enregistrer l'utilisateur
Difficile
00:04:06
Se connecter avec deux utilisateurs et tester les redirections
Difficile
00:05:41
Comprendre le rôle d'APP_SECRET et du fichier .env.local
Difficile
00:04:22
Générer une clé secrète avec secrets:generate-keys
Difficile
00:02:57
Sécuriser une méthode de contrôleur avec #[IsGranted]
Difficile
00:03:47
Appliquer #[IsGranted] à toute la classe du contrôleur
Difficile
00:02:56
Combiner #[IsGranted] sur la classe et sur les méthodes
Difficile
00:02:42
Masquer un bouton dans Twig avec is_granted
Difficile
00:02:53
Comprendre la priorité de access_control sur #[IsGranted]
Difficile
00:04:48
Générer l'inscription avec make:registration-form
Difficile
00:04:53
Personnaliser le RegistrationFormType et son template
Difficile
00:05:08
Générer et exécuter la migration de l'entité User
Difficile
00:02:43
Tester l'inscription et attribuer ROLE_USER par défaut
Difficile
00:06:50
Navigation et liens actifs dans Twig
Construire une barre de navigation Bootstrap dans base.html.twig
Moyen
00:04:19
Afficher l'utilisateur connecté et le lien de déconnexion
Moyen
00:03:46
Tester la connexion et configurer la redirection après déconnexion
Moyen
00:04:11
Rendre un lien de menu actif avec app.request.get('_route')
Moyen
00:06:04
Utiliser app.current_route pour activer un lien
Moyen
00:04:48
Activer un lien de menu avec starts with dans Twig
Moyen
00:04:45
Voters : autorisations fines
Comprendre le principe des voters
Difficile
00:04:26
Découvrir l'interface d'un voter et la méthode supports
Difficile
00:05:39
Comprendre voteOnAttribute et les constantes de permission
Difficile
00:04:38
Lire l'exemple de voter : supports, sujet et TokenInterface
Difficile
00:04:34
Router les permissions avec l'expression match
Difficile
00:03:13
Générer un voter avec make:voter
Difficile
00:03:43
Déclarer les constantes de permission de l'AgenceVoter
Difficile
00:03:15
Injecter AccessDecisionManagerInterface dans le voter
Difficile
00:02:23
Implémenter supports : contrôler l'attribut demandé
Difficile
00:05:44
Vérifier le sujet avec instanceof dans supports
Difficile
00:05:25
Récupérer l'utilisateur et accorder tous les droits à ROLE_ADMIN
Difficile
00:04:44
Définir les règles d'accès avec match dans voteOnAttribute
Difficile
00:04:06
Appliquer le voter avec denyAccessUnlessGranted
Difficile
00:04:38
Protéger la création et l'affichage d'une agence avec le voter
Difficile
00:03:30
Afficher un bouton selon le voter avec is_granted dans Twig
Difficile
00:07:20
Internationalisation
Configurer les fichiers de traduction et la locale par défaut
Moyen
00:05:22
Utiliser le filtre trans avec des clés de traduction
Moyen
00:04:27
Renseigner les traductions dans messages.fr.yaml
Moyen
00:02:40
Passer des paramètres à une traduction Twig
Moyen
00:03:34
Traduire les libellés d'un formulaire avec des clés
Moyen
00:03:20
Extraire les traductions avec translation:extract
Moyen
00:05:55