Détails du sujet

Symfony 3 [Quiz 2] [Pile 3]

Services, DIC, Doctrine dans le FrameWork Symfony 3

Toutes les cartes

Dans services.yml

Dans quel ordre doit-on utiliser les 3 arguments pour la signature du constructeur de la classe?

Le service, le paramètre, la variable.

Car on respecte l'ordre d'écriture des paramètres dans services.yml


Dans services.yml

Quels seront les attributs et le constructeur de la classe OCAntispam.php?


Que faisons-nous en ligne 12 avec $mailer?

On injecte le service 'mailer' dans le constructeur de la classe

On parle d'Injection de dépendance


Quelle est l'utilité de l'injection de dépendance dans les services?

Cele permet à un service d'utiliser un service dont il aurait besoin pour fonctionner.


Ligne 7

'mailer' est-il un alias?

Oui

C'est un pointer vers un service.

Le conteneur de service utilise l'alias 'mailer' qui pointe vers le service switfmailer.mailer.default

Si un jour on change de bibliothèque pour envoyer des courriers, on utilisera toujours le pointer 'mailer' dans les contrôleurs mais celui-ci pointera vers le nouveau service d'envoie d'email: 'SmtpClient' par exemple


Que faut-il garder en tête pour obtenir des contrôleurs lisibles et simples?

Utiliser les services dans les contrôleurs


Qui assure l'injection des dépendances pour un service qui aurait besoin pour fonctionner de variables, de paramètres ou de services?

Le Conteneur d'Injection de Dépendance.

Il sait qu'elles dépendances injecter dans le service grâce au fichier de configuration services.yml


Quel est l'ORM installé par défaut dans Symfony?

Doctrine 2

ORM = Object Relational Mapping


Qu'est-ce qu'une Entité pour Doctrine?

Une Classe avec des informations de mapping afin que Doctrine puisse l'enregistrer en base de données.


Doctrine

Quel terme emploit-on pour parler d'enregistrement d'une Entité dans la couche d'abstraction Doctrine?

Persister une entité


Qu'est ce qui permet à Doctrine de savoir qu'une classe est une Entité qui représente tel champ de telle table de base de données?

Les informations de mapping comme les annotations qui sont ajoutées dans la classe.


Quel fichier permet à Doctrine de savoir quelle base de données utiliser?

Le fichier app/config/parameters.yml


Quels sont les deux moyens que l'on possède pour créer une entité?

  1. A la main (Classe + information de mapping)
  2. En ligne de commande

Dans une Entité

Quels sigles utiliser pour ajouter des informations de mapping en annotations DockBlocks?

/**

Donnez un synonyme aux informations de mapping que l'on ajoute aux classes afin qu'elles deviennent des Entités.

Des métadonnées en Français

Metadata en Anglais


Que signifie "mapper" une classe?

C'est lui ajouter des informations de mapping (métadonnées) afin que Doctrine puisse faire le lien entre cette classe et la représentation physique en base de données.


En ligne de commande

Comment générer une entité pour la première fois?

>php bin/console doctrine:generate:entity


Vrai ou Faux

Le création d'une Entité en ligne de commande produit

  • la classe
  • ses attributs, setters, getters
  • ses informations de mapping

Vrai


Doctrine

En plus de gérer nos données, le modèle peut-il aussi contenir de la logique pour notre application?

Oui


Doctrine

Que signifie Affiner une Entité avec de la Logique Métier?

Une méthode d'Entité qui contient de la logique métier

On crée des méthodes dans l'Entité qui utilisent des attributs mappés afin d'en déduire une information.qui n'a pas besoin d'être mappée et persistée en base de données.

Exemple: déduire le prix total d'une commande


Quelle est l'annotation à mettre au dessus du nom de la classe afin que Doctrine la considère comme une entité?

Entity

Pourquoi utilse-t-on @ORM\Entity et pas @Entity?

Pour définir le namespace des annotations utilisées par Doctrine 2 afin de ne pas les confondre avec d'autres annotations qui utilisent un autre namespace.


Doctrine

Quelle différence entre l'annotation @ORM\Table(name="oc_advert") et la ligne 11?

  • Ligne 11: Le nom de la table sera "Advert", car par défaut c'est celui de la classe
  • Avec @ORM\Table(name="oc_advert") le nom de la table sera "oc_advert" en minuscules

Commentez la ligne 12

On indique à Doctrine;

  1. Que la classe Advert sera une entité
  2. Le namespace complet du repository qui gère l'entité

Doctrine

Quelle est l'utilité d'un repository?

Il permet de récupèrer le contenu de notre entité depuis la base de données


Entité

Quelle est l'annotation à mettre au dessus du nom de la classe afin d'indiquer à Doctrine le nom de la table en base de données?

Table
  1. Avec Table()  nom table = nom classe
  2. Avec Table(name="non_en_minuscules") on respecte les conventions de nommage de table sql

 


Dans un entité

Quelle est l'utilité de l'annotation "column"?

Afin de préciser à Doctrine

  1. le nom de la colonne dans la table
  2. le type de la donnée
  3. la longueur de la donnée

Vrai ou Faux

Les types déclarés dans les annotations des entités sont spécifiques à Doctrine

Vrai

Le type Doctrine "decimal" correspond au type SQL "DECIMAL"

Notez que tous les types Doctrine sont écris en minuscules


Vrai ou Faux

Les entités sont-elles des services?

Non


Vrai ou Faux

Doctrine permet de persister entre 2 requêtes les datas dans une base de données.

Vrai


Quel est le rôle d'un ORM?

Il organise la persistance de nos données en base de données pendant que l'on manipule des objets


En ligne de commande

Comment créer notre table en base de données pour Doctrine?

>php bin/console doctrine:database:create


En ligne de commande

Comment créer nos tables aprés avoir créé notre base de données et nos entités Doctrine?

  • >php bin/console doctrine:schema:update --dump-sql

puis aprés avoir vérifié que la requête préparée est bonne

  • >php bin/console doctrine:schema:update --force

En ligne de commande comment avec Doctrine:
  1. Créer une bdd
  2. Créer une Entité
  3. Mettre à jour une entité modifiée
  4. Créer la table correspondant à l'entité
  • 1.>php bin/console doctrine:database:create
  • 2.>php bin/console doctrine:generate:entity
  • 3.>php bin/console doctrine:generate:entities NomBundle:NomEntité
  • 4.>php bin/console doctrine:schema:update --dump-sql
  • 4.>php bin/console doctrine:schema:update --force

En ligne de commande

Quelle commande lancer pour créer les setters et les getters d'une entité Doctrine existante dont on a ajouté manuellement un attribut?

>php bin/console doctrine:generate:entities NomBundle:NomEntité


Doctrine

Quelle est la différence entre ces deux lignes de commande?

  1. >php bin/console doctrine:generate:entity
  1. >php bin/console doctrine:generate:entities NomBundle:NomEntité
  1. Génère une entité entière pour la première fois
  2. Met à jour à une entité exitante modifiée

Doctrine

Aprés l'update d'une entité avec la ligne de commande suivante, peut-on revenire à l'entité précédente?

>php bin/console doctrine:generate:entities NomBundle:NomEntité

Oui

L'Entité précédente est sauvée dans le fichier

NomEntité.php~


En ligne de commane

Que faut-il faire aprés l'ajout ou la suppression d'une entité ou la modification des informations de mapping?

MAJ du schéma de la BDD

>php bin/console doctrine:schema:update --dump-sql

puis

>php bin/console doctrine:schema:update --force


Dans un contrôleur qui hérite du contrôleur de base

Donnez deux manières de récupérer le service Doctrine

  • $this->getDoctrine()
  • $this->get('doctrine')

Quelles sont les deux parties de Doctrine?

  1. La partie ORM pour gérer nos Entités
  2. La partie DBAL pour gérer les connexions aux BDD (Data Base Abstraction Layer)

Quel est l'intérêt de la partie DBAL de Doctrine.

La Data Base Abstraction Layer permet à Doctrine de fonctionner avec différents types de SGBD comme MySQL, PostgreSQL etc...


Dans un contrôleur qui hérite du contrôleur de base

Comment récupérer le Gestionaire d'Entités que l'on appel en Anglais l'Entity Manager?

Si on a qu'un gestionnaire
  • $this->getDoctrine()->getManager()

ou

  • $this->get('doctrine.orm.entity_manager')

Qui dans Doctrine se charge de persister nos Entités en base de données?

L'Entity Manager


Dans un contrôleur qui hérite du controleur de base

Comment récupérer le répositorie d'une Entité?


Doctrine

Combien de Repository par Entité a-t-on?

1


Lorsque l'on récupère un Repository de la manière suivante, dans quel répertoire doit se trouvé l'Entité?

Dans le répertoire \Entity du Bundle


Commentez les lignes suivantes
  • 1 Création d'une instance de l'entité Advert
  • 2 à 4 Remplissage de l'Entité
  • 5 Récupération du Manageur d'Entités
  • 6 On demande de garder cette Entité en mémoire avant le prochain Flush()
  • 7 On demande d'ouvrir une transaction avec toutes les Entités persistées depuis le dernier Flush() et de les enregistrer en bdd

Dans un Contrôleur, quel code permet de sauver en mémoire une entité A avant de la sauvegarder en base de données?

  • $em = $this->getDoctrine->getManager()
  • $em->persist(A)

Dans un Contrôleur, quel code permet de d'enregistrer en base de données une entité A?

  • $em = $this->getDoctrine->getManager()
  • $em->flush(A)

Si l'on souhaite voir les requêtes effectuées par Doctrine, où doit-on regarder dans la barre d'outil Symfony?

Dans l'onglet base de données

Très utile pour vérifier la valeur des paramètres