Vous êtes sur la page 1sur 8

1

Ecole Supérieure Privée Technologies & Ingénierie


Type d’épreuve : Devoir Examen
Enseignant : Wissem ELJAOUED
Matière : Framework PHP (Symfony)
Année Universitaire : 2019-2020 Semestre :1
Classe : CII-2-GLSI A, B
Documents : Autorisés Non autorisés
Date : 17/01/2020 Durée : 1h :45
Nombre de pages : 8 pages

Exercice 01 : (11 pts)


1. L’objectif d’un contrôleur de Symfony est de renvoyer un …….. ?
a) Objet Response
b) Objet Request
c) Objet PHP
d) Aucune de ces réponses n’est vraie.

2. Quel est le fichier de la configuration de la base de données ?


a) database.yml
b) parameters.yml.dist
c) parameters.yml
d) config.yml
3. Supposons qu’on a deux templates Twig : enfant.twig qui étend parent.twig qui contient un
block appelé body. Si l'on surcharge ce block dans enfant.twig, comment retrouver le contenu
de ce block provenant de parent.twig ?

a) {% parent() %}
b) {{ parent() }}
c) {% parent(body) %}
d) {{ parent(body) }}

4. Sur une entité doctrine, en utilisant les annotations, quelle annotation permet de définir que la
propriété est une clé primaire
a) @ORM\Primary Key
b) @ORM\Id
c) @ORM\Column(type= ‘integer’, primary=true)
d) @ORM\Column(type= ‘integer’, primaryKey=true)

5. En Twig, pour appliquer un filtre sur un attribut attribut d’un objet $objet, quelle est la bonne
syntaxe ?
a) {{ objet->attribut | filtre }}
b) {% objet.attribut | filtre %}
c) {{ objet.attribut | filtre }}
d) {{ filtre(objet.attribut) }}
2
6. Quelle est la commande pour mettre à jour une base de données ?
a) php bin/console doctrine:schema:update
b) php bin/console doctrine:database:update
c) php bin/console doctrine:create:schema
d) php bin/console doctrine:database:create

7. Quelle est la commande pour créer une entité ?


e) php bin/console doctrine:create:entity
f) php bin/console doctrine:entity:generate
g) php bin/console doctrine:generation:entity
h) php bin/console doctrine:generate:entity

8. Soit la route suivante :

/**
*@Route(“/Formation/{annee}/{slug}.{format}”, name=”formation”, requirements= {
*“annee” = “\d{2}”, “format”=”css|html”}, defaults={“format”=”html”} )
*/
Quelle URL sera bien interceptée parmi les URLs suivantes :
a) /Formation/20/Java.json
b) /Formation/2020/Java.css
c) /Formation/20/Java
d) /Formation/2/Java.html

9. Parmi les codes du contrôleur suivant, lequel supprime correctement une entité ?

a) c)
$em= $this->getDoctrine()->getManager(); $em= $this->getDoctrine()->getManager();
$salle = $em-> getRepository('NBundle:Salle')
-> find($id); $em->remove();
$em->flush();
$em->remove($salle);
$em->flush();
b) d)
$em= $this->getDoctrine()->getManager(); $salle = $em-> getRepository('NBundle:Salle')
$salle = $em-> getRepository('NBundle:Salle') -> find($id);
-> find($id);
$em->delete ($salle);
$em->remove ($salle); $em->flush();

10. Pour ajouter un attribut category qui va contenir un objet Category en relation ManyToOne.
Cet attribut est facultatif. Seules les opérations de suppression doivent être réalisées en cascade.
Quelle doit-être l’annotation ?
3
a) c)
<?php <?php
/** /**
*@ORM\ManyToOne(targetEntity= *@ORM\ManyToOne(targetEntity=
’’AppBundle\Entity\Category) ’’AppBundle\Entity\ Category,
*@ORM\JoinColumn(nullable=true) cascade=(“delete”))
*/ *@ORM\JoinColumn(nullable=true)
Private $category; */
Private $category;
b) d)
<?php <?php
/** /**
*@ORM\ManyToOne(targetEntity= *@ORM\ManyToOne(targetEntity=
’’AppBundle\Entity\ Category, nullable=false) ’’AppBundle\Entity\ Category,
*/ nullable=true)
Private $category; *@ORM\Cascade(“delete”)
*/
Private $category;

11. Convertir le code PHP suivant en Twig.


<ul> <?php
if (count($list_membres) > 0)
{ foreach ($list_membres as $membre )
{ echo ‘<li>’. $membre->getPseudo().’</li>’ ; }
} else { ?>
<li> Pas d’utilisateur trouvé </li>
< ?php } ?>
</ul>

12. Dans un contrôleur, comment rediriger vers le site suivant http://www.mysite.com ? Donner
deux méthodes possibles.

13. Soit le diagramme de classe suivant :


4

Ecrire en DQL les requêtes suivantes (sachant que ces entités se trouvent sous le bundle
MagasinBundle)

13.a. La liste des articles avec quantité de stock égale à 20

13.b. La quantité moyenne des articles par catégorie

13.c. Les désignations des articles et les noms de leurs fournisseurs.

Problème : (9 pts)
Notre objectif est d’implémenter une application web qui gère le service de réservation dans un hôtel.
Dans ce cadre, on propose de créer une application avec Symfony 3.4.

Soit le diagramme de classes suivant :

Tous les fichiers sont situés sous le bundle HotelBundle.

A. Configuration des entités :


A.1. Compléter les annotations (et les attributs) manquantes dans les entités suivantes sachant qu’on
peut naviguer entre les entités dans les deux sens :

<?php <?php
namespace HotelBundle\Entity; namespace HotelBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
…………………………………………………………….. ……………………………………………………………..
…………………………………………………………….. ……………………………………………………………..
…………………………………………………………….. ……………………………………………………………..
class Chambre class Reservation
{ {
/** /**
5
* @ORM\GeneratedValue * @ORM\GeneratedValue
* @ORM\.......................................... * @ORM\.........................................
* @ORM\.......................................... * @ ORM\.........................................
*/ */
private $id; private $id;

/** /**
* @ORM\......................................... * @ ORM\.........................................
*/ */
private $prix; private $dateArr;

/** /**
* @ORM\......................................... * @ORM\.........................................
*/ */
private $nbrLit; private $dateDep;
……………………………………………………………..
……………………………………………………………..
/** ……………………………………………………………..
* @ORM\.........................................
*/ //Getters-Setters
private $confort; }

……………………………………………………………..
……………………………………………………………..
//Getters-Setters
}

B. Affichage de la liste des réservations :

Soit ReservationController, le contrôleur responsable des actions de gestion des réservations.

B.1. Terminer l’action listReservationAction() qui permet de retourner la page Twig suivante :
‘listReservation.html.twig’ (se trouve sous : HotelBundle/Resources/views/Reservation). Cette page
Twig permet de retourner la liste des réservations sauvegardées dans notre base de données.

<?php
namespace HotelBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ReservationController extends Controller


{
public function listReservationAction()
{
//EntityManager
…………………………………………………………………………………………………………………

//Liste des réservations


…………………………………………………………………………………………………………………

return $this->render('…………………………………………………………………………………',
array(
6
……………………..……………………………………………..
));
}
}

B.2. Compléter la page Twig suivante : ‘listReservation.html.twig’. Pour le client d’une réservation, on
veut afficher son nom et pour sa chambre, afficher son id.

<h1> Liste des réservations </h1>


<table border="1">
<tr>
<td>………………………….. </td>
<td>………………………….. </td>
<td>………………………….. </td>
<td>………………………….. </td>
<td>………………………….. </td>
</tr>
…………………………………………………………………………………………………………………………………………………
</table>

C. Update d’une Chambre :

Pour mettre à jour une Chambre, nous avons besoin de créer un formulaire pour introduire les données
d’une chambre. Soit ‘ChambreForm’, le formulaire de mise à jour d’une chambre.

Soit ChambreController, le contrôleur responsable des actions de gestion des chambres.

C.1. Terminer l’action updateChambreAction() qui permet de:

 Rediriger vers la liste des chambres Si la mise à jour d’une chambre est effectuée
correctement (sachant que le nom de la route de la liste des chambres est
listeChambreRoute).
 Sinon, Afficher le formulaire ‘ChambreForm’ en utilisant la page Twig suivante :
‘updateChambre.html.twig’ (se trouve sous : HotelBundle/Resources/views/Chambre).
Sachant que le nbrLit d’une chambre doit prendre toujours la valeur 2.

<?php
namespace HotelBundle\Controller;
//use …
class ChambreController extends Controller
{
public function updateChambreAction(Request ……………………, …………..)
{
// EntityManager
………………………………………………………………………………………………………………………………...

// Récupération de la Chambre à modifier


…………………………………………………………………………………………………………………………………

// Création d’un formulaire


7
$form = $this->…………………………… (………………………………::class, …………………………..);
$form->handleRequest(………………………..);

if (………………………………………………………………….…………………………..)
{
//Update de la chambre
……………………………………………………………………………………………………………………………..

return $this-> ………………………………………………………………………………………………………


}

return $this->render('………………………………………………………………………………………….',
array(
……………………………………………………………………………
));
}
}

C.2. Pour la configuration des routes de notre application, nous utilisons le fichier ‘Routing.yml’.
Compléter la route responsable à la mise à jour d’une chambre.

agence_imm_update_chambre :
path: ……………………………………………………….
defaults: { _controller: ………………………………………………………………………………………….. }

C.3. Compléter la page Twig suivante : ‘updateChambre.html.twig’.

<h1>Mise à jour d'une chambre </h1>

<form action=…………………… method=……………………..>

………………………………………………………………………………

<input type=………………………. />


</form>

D. Ajout d’une réservation :

Soit ‘ReservationForm’, le formulaire d’ajout d’une réservation.

D.1. Compléter le formulaire ‘ReservationForm’ :

Afficher les CIN des clients (respectivement les id des chambres) pour la liste déroulante des clients
(respectivement des chambres).

<?php
namespace HotelBundle\Form;

class ReservationForm extends AbstractType


{
8
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(………………….., ………………………………… ::class)
…………………………………………………………………………………………………………………………………………
}
}

E. Doctrine Query Language (DQL) :

E.1. Compléter l’action rechercheAction() qui permet de rechercher les réservations par date d’arrivée.
La page Twig de la recherche est recherche.html.twig et se trouve sous : HotelBundle/Resources/views.

<?php
namespace HotelBundle\Controller;
//use …
class ReservationController extends Controller
{
public function rechercheAction(Request ……………………)
{
// EntityManager
………………………………………………………………………………………………………………………………...

if(…………………………………………………………………………………………..) {

$dateSaisie=$request->get('input_recherche');

//Créer la requête et retourner le résultat


.………………………………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………………………….
}

return $this->render('………………………………………………………………………………………….',
array(
……………………………………………………………………………
));
}
}

Annexe :
Pour afficher une liste déroulante de type Entity dans un formulaire, utiliser le code suivant :

EntityType::class, array( 'class' => 'NomBundle\Entity\NomEntity', 'choice_label'=>'NomLabel’,


'expanded'=>false, 'multiple'=>false)