Détails du sujet

Symfony 3 [Quiz 3] [Pile 1]

Doctrine et Formulaires dans le FrameWork Symfony 3

Toutes les cartes

Sous Windows Avec Xampp

Quelles sont les étapes à suivre pour installer sur son ordinateur personnel un projet web symfony récupéré depuis GitHub?

Sous Windows Avec Xampp
  1. Copier le répertoire du projet dans htdocs
  2. Verifier la présence du fichier composer.phar à la racine
  3. Mettre son propre fichier parameters.yml dans le répertoire app\config
  4. Lancer >php composer.phar selfupdate (pour mettre à jour composer)
  5. Lancer >php composer.phar update (pour charger les dépendances)
  6. Lancer xampp
  7. Lancer dans le browser web: localhost/NomDuRépertoire/web/app_dev.php

Doctrine

Qu'est-ce que le cycle de vie d'une entité?

  • C'est tout ce qui peut arriver à une entité, de sa création, à sa mise à jour, jusqu'à sa suppression
  • On parle de ''Lifecycle'' en Anglais

Doctrine

Qu'est-ce qu'un ''Lifecycle Callback'' d'une entité?

  • C'est une méthode callback que l'on demande à Doctrine d'exécuter à une certain moment du cycle de vie de l'entité

Doctrine

Le ''Lifecycle callback'' d'une entité, peut-il avoir un argument?

  • Non pour la version 2 de Doctrine
  • Oui depuis la version 2.4 où l'on peut passer en argument l'événement déclencheur

Doctrine

Quelles sont les étapes pour ajouter un ''Lifecycle Callback'' à une entité?

  1. Ajouter à l'entité l'annotation ''HasLifecycleCallbacks''
  2. Ecrire la méthode qui correspond au ''Lifecycle Callback'' dans l'entité
  3. Ajouter à la méthode une des annotations suivantes ''PreUpdate'', ''PrePersist', ''PreRemove'', ''PostUpdate'', ''PostPersist'', ''PostRemove'', ''PostLoad''

Doctrine

Les ''Lifecycle Callbacks'' se déclenchent-ils lorsque l'on fait des requêtes DQL ou des requêtes faites avec le QueryBuilder?

Non


Doctrine

Dans quels cas les ''Lifecycle Callbacks'' d'entité se déclenchent-ils?

Quand on crée, modife ou supprime les entités en manipulant leurs instances (objets).


Doctrine

Que fait la ligne 4 pour cette méthode d'entité?

L'annotation indique à Doctrine que cette méthode (Lifecycle Callback) devra être exécutée avant la modification de l'entité.


Doctrine - Que fait la ligne 8?

L'Annotation indique à Doctrine que cette classe contient un ''Lifecycle Callback''


Doctrine

Citez quelques ''Lifecycle Events''

  1. PrePersist
  2. PostPersist
  3. PreUpdate
  4. PostUpdate
  5. PreRemove
  6. PostRemove
  7. PostLoad

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PrePersist s'exécutera à quel moment?

  1. Par $em->persist($entityA) de l'entity manager
  2. Par un $em->flush() qui déclenche un $em->persist($entityB) sur l'entité B qui est associée à l'entité A par un ''cascade persist''
  • PrePersist ne s'applique qu'aux entités nouvellement créées et ne s'applique donc pas au futurs updates.

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PostPersist s'exécutera à quel moment?

  • Aprés la sauvegarde en base de données
  • Juste aprés $em->flush() et pas aprés $em->persist($entité)

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PreUpdate s'exécutera à quel moment?

  • Juste avant la modification de l'entité (qui était déjà existante)
  • c'est à dire Juste avant $em->flush()

Doctrine

La méthode $em->persist($entité) sauve-t-elle l'entité dans le cache de Doctrine et pas dans la base de données?

Oui

Il faut faire un $em->flush() pour que l'entité soit enregistrée dans la base de données


Doctrine - Vrai ou Faux

Quand on dit que l'on persiste une entité Doctrine en base de données c'est qu'on l'enregistre dans cette BDD.

Mais quand on utilise la méthode $em->persist($entité), l'entité n'est pas encore sauvée dans la BDD, il faut faire un $em->flush() pour qu'elle soit vraiment enregistrée

Vrai


Doctrine

Un ''Lifecycle Callback'' associé à l'événement PostUpdate s'exécutera à quel moment?

  • Aprés la mise a jour en base de données
  • C'est à dire après: $em->flush()

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PreRemove s'exécutera à quel moment?

  1. Juste avant $em->remove($entitéA)
  2. Dans un $em->flush() qui déclenche un $em->remove($entityB) sur l'entité B qui est associée à l'entité A par un ''cascade remove''
  • Notez qu'à ce stade l'entité n'est pas encore supprimée de la base de données. Elle le sera que si tout se passe bien dans le $em->flush()

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PostRemove s'exécutera à quel moment?

  • Aprés la suppression de l'entité en base de données
  • C'est à dire aprés: $em->flush()

Doctrine

Un ''Lifecycle Callback'' associé à l'événement PostLoad s'exécutera à quel moment?

  1. Juste aprés le chargement de l'entité par l'Entity Manager
  2. Juste aprés $em->refresh()

Doctrine

Dans quels cas utilse-t-on les ''Lifecycle Callbacks'' ?

Pour des simples opérations spécifiques à une entité particulière.


Comment appel-t-on en Français un ''Lifecycle Callback'' d'une entité?

Un événement

ou

Un Callback de cycle de vie


Doctrine

Dans un ''Lifecycle Callback'' déclenché par postPersist a-t-on accés à la valeur de la clef primaire de l'entité?

Oui,

Car la sauvegarde en base de données de l'entité a eu lieu


Doctrine

Dans un ''Lifecycle Callback'' déclenché par prePersist a-t-on accés à la valeur de la clef primaire de l'entité?

Non,

Car l'entité n'est pas encore sauvée en base de données


Dans un ''Lifecycle Callback'' déclenché par preUpdate a-t-on accés à la valeur de la clef primaire de l'entité?

Oui,

Car l'entité existait déjà dans la base de données


Doctrine

Dans un ''Lifecycle Callback'' déclenché par postUpdate a-t-on accés à la valeur de la clef primaire de l'entité?

Oui,

Car l'entité existait déjà dans la base de données


Doctrine

Dans un ''Lifecycle Callback'' déclenché par preRemove a-t-on accés à la valeur de la clef primaire de l'entité?

Oui,

Car l'entité est toujours dans la base de données


Doctrine

Dans un ''Lifecycle Callback'' déclenché par postRemove a-t-on accés à la valeur de la clef primaire de l'entité?

Non,

Car l'entité a été suprimée de la base de données


Doctrine

Dans un ''Lifecycle Callback'' déclenché par postLoad a-t-on accés à la valeur de la clef primaire de l'entité?

Oui,

Car l'entité est toujours dans la base de données


Doctrine

Dans une entité peut-on définir plusieurs ''Lifecycle Callbacks'' pour un même événement (preUpdate, postLoad etc...)?

Oui


Doctrine

Peut-on demander à Doctrine d'exécuter un service pour un ''Lifecycle Event'' d'une entité?

Oui


Doctrine

Quelles sont les étapes pour faire en sorte qu'un service se déclenche à l'évènement postPersist d'une entité A?

  • 1-Ecrire une classe pour ce service qui contienne la méthode: postPersist(LifecycleEventArgs $arg)
  • 2-Dans la méthode on exécute ce que l'on souhaite si l'entité récupérée est une instance de l'entité A: if( $entity = $arg->getObject() instanceOf A)
  • 3-On déclare le service dans src\ NomBundle\ Resources\ config\ services.yml avec l'option ''tags'':
  • - { name: doctrine.event.listener, event: postPersit }

Doctrine
  1. Si l'on fait en sorte qu'un service se déclenche à l'évènement postPersist, par défaut est-ce que toutes les entités seront concernées?
  2. Si Oui, que faut-il faire pour que seules les instances de l'entité A soient touchées?
  1. Oui
  2. Si l'on souhaite toucher uniquement les instances de l'entité A il faut le préciser dans la méthode postPersist du service.

Doctrine-Commentez ces lignes
Configuration d'un service callback
  • Ligne 4: nom du service qui sera appelé avec $this->get('nom du service')
  • Ligne 5: FQCN du service
  • Ligne 7: Nom d'un autre service utilisé par le service
  • Ligne 9: On indique au service container que le service sera déclenché par un évènement Doctrine postPersist

Doctrine

Commentez cette méthode située dans un service

  • Ligne 1: On définit comme argument une instance de la classe LifecycleEventArgs afin de pouvoir récupérer l'entité associée à cet événement
  • Ligne 3: On récupère l'entité associée à cet événement
  • Ligne 4 à 6: On ne fait rien si l'entité n'est pas une instance d'Application
  • Ligne 8: Action exécutée si l'entité est une instance d'Application

Doctrine

Quelles sont les 3 options qui s'offrent à nous pour intervenir sur les entités durant leur cycle de vie?

  1. Les ''Lifecycle Callbacks'', qui sont des méthodes définies dans les entités
  2. Les ''Services Callbacks''
  3. Les ''Extensions Doctrines''

Tous se déclenchent à un événement que l'on choisit

 


Doctrine

Citez un Bundle connu qui intègre la librairie DoctrineExtensions et gère plus facilement les tâches usuelles des entités durant leur cycle de vie.

StofDoctrineExtensionBundle


Doctrine

Qu'est-ce que DoctrineExtensions?

 

  • Une librairie qui intègre des fonctionnalités qui interviennent sur les entités durant leur cycle de vie.
  • Les fonctionnalités sont:

Sluggable, Translatable, Timestampable, Loggable, Tree and Sortable


Formulaires
  1. Un formulaire se construit-il sur un objet existant?
  2. L'Objectif du formulaire est-il d'hydrater cet objet?

1- Oui

2- Oui


Formulaires

Quel est le nom du composant de Symfony qui permet de créer efficacement des formulaires?

Le composant Form


Formulaires

Peut-on utiliser le composant Form de Symfony dans une application PHP qui n'utilise pas Symfony?

Oui


Formulaires

Pour se construire, les formulaires ont-ils besoin d'une entité ou d'un objet?

Pour se construire les formulaires ont besoin d'un objet.

Les entités sont des objets donc elles conviennent pafaitement pour la construction de formulaire.


Formulaires

Quels sont les deux objectifs d'un formulaire?

  1. Traduire les données d'un objet en un formulaire HTML pour permettre au client de modifier les données.
  2. Récupérer les données soumises par le client via un formulaire et les appliquer à l'objet. On parle d'hydratation de l'objet par les données du formulaire.

Formulaires

A quoi faut-il penser au niveau des setters d'une classe, si l'on sait que notre formulaire utilisera une instance de cette classe?

Il faut penser à écrire les setters sous la forme setNomDeLattribut() (setName(), setTitle() etc...) et pas set_NomDeLattribut().

Car le composant Form de Symfony utilise les setters setNomDeLattribut() pour hydrater l'objet.


Formulaires

Quels sont les deux éléments nécessaires à la création d'un formulaire?

  1. Un objet
  2. Un constructeur de formulaire

Formulaires

Dans un contrôleur qui hérite du contrôleur de base, quelle est la méthode raccourcie qui nous permet de créer un formulaire?

$form = $this->createForm(...)


Formulaires

Quels sont les deux arguments que la méthode raccourcie createForm(...) utilise pour créer un formulaire?

  1. Le FormType de l'entité
  2. L'Entité elle même

$this->createForm(ClientType::class, $client)


Formulaire
  1. Qu'est-ce qu'un FormType?
  2. Dans quel répertoire est-il sauvé?
  1. C'est une classe qui contient la définition d'un formulaire. Cela nous permet de réutiliser sa définition. Ce n'est pas un formulaire.
  2. Il est sauvé par convention dans src/NomDuBundle/Form/

Formulaires

En ligne de commande, comment générer un FormType à partir d'une entité Advert située dans CoreBundle par exemple?

>php bin/console doctrine:generate:form  CoreBundle:Advert


Qu'est-ce que la Symfony Live Paris?

Un évènement annuel Parisien organisé par Sensiolabs sur deux jours en langue Française.

Il permet aux fans de Symfony:

  1. D'écouter des conférences de spécialistes
  2. De rencontrer des sponsors qui recrutent
  3. De se retrouver dans une ambiance trés sympathique

Quelle est la différence entre la Symfony Live et la Symfony Con?

  • La Symfony Live est dans la langue du pays qui reçoit.
  • La Symfony Con est en Anglais quelque soit le pays qui reçoit.