# TP2 - Routage, Services et Injections de Dépendances ## Objectif Les objectifs de ce TP sont : - De prendre en main les méthodes de routage de `Symfony` (GET/PUT, avec et sans paramètres) - De prendre en main la création de services - De comprendre le fonctionnement de l'autowiring ## Consignes - Durée : 2 heures - Tous vos projets `Symfony` sont à placer votre dossier `~/public_html`. - Utilisez le serveur `londres.iut.local` pour tester vos pages et non la commande `symfony server:start`. ## Ressources - Documentation de Symfony sur les services : [https://symfony.com/doc/5.x/service_container.html](https://symfony.com/doc/5.x/service_container.html) - Documentation de Symfony sur les routes : [https://symfony.com/doc/5.x/routing.html](https://symfony.com/doc/5.x/routing.html) - Nous allons créer un réseau social nommé `TweetTok` où les messages sont nommés des `Twok`. - Pour le moment, les `Twoks` seront stockés en dur dans un fichier JSON. ```json [ { "ID": 42184, "Author": "Yvan Durev", "Tweet": "J'ai vu le plus beau coucher de soleil à la plage ! #béni #amoureuxducoucherdesoleil", "Timestamp": "2023-10-18T09:31:27" }, { "ID": 10727, "Author": "Claire Voyance", "Tweet": "Je n'arrive pas à croire que j'ai enfin terminé mon premier marathon ! #marathon #travaildur", "Timestamp": "2023-04-26T18:38:40" }, { "ID": 51869, "Author": "Justin Ptipeu", "Tweet": "Lire un bon livre, c'est comme entreprendre un voyage... #ratdebibliothèque #lecture", "Timestamp": "2023-11-11T18:22:50" }, { "ID": 29866, "Author": "Jean Bonboeur", "Tweet": "Rien ne vaut une bonne tasse de café par un jour de pluie. #café #jourdepluie", "Timestamp": "2023-05-18T19:14:26" }, { "ID": 38703, "Author": "Alex Térieur", "Tweet": "Je travaille sur ma nouvelle peinture, je me sens inspiré ! #art #créativité", "Timestamp": "2023-07-13T01:53:21" }, { "ID": 72106, "Author": "Igor Gonzola", "Tweet": "Explorer la ville et trouver des trésors cachés. #voyage #aventure", "Timestamp": "2023-01-31T12:24:30" }, { "ID": 80606, "Author": "Agathe Afeeling", "Tweet": "La soirée jeux en famille est toujours tellement amusante ! #tempsenfamille #jeuxdesociété", "Timestamp": "2023-09-22T13:27:22" }, { "ID": 54252, "Author": "Samira Bien", "Tweet": "J'ai cuisiné une nouvelle recette ce soir et c'était délicieux ! #cuisine #gourmand", "Timestamp": "2023-10-08T09:07:24" }, { "ID": 39343, "Author": "Alfonse Danlta", "Tweet": "La nouvelle saison de ma série préférée est sortie ! Temps de binge-watching. #sérieTV #bingewatching", "Timestamp": "2023-12-25T16:36:50" }, { "ID": 37497, "Author": "Jean Peuplu", "Tweet": "Je réfléchis aux petites joies de la vie. #gratitude #bonheur", "Timestamp": "2023-07-20T06:04:05" } ] ``` ## Partie 1 : Services et Injection de Dépendances (1 Heure) 1. **Construction d'un Service pour Lire et Ecrire dans la base des `Twoks`** : - Créer une classe `TwokManager` avec une méthode `getTwokByID` et un méthode ``addTwok` qui permettent de récupérer un `Twok` par son identifiant et d'ajouter un nouveau `Twok` au fichier JSON (attention à ne pas écraser les `Twoks` déjà dans le fichier!). ```php // Rappels pour lire un fichier JSON en PHP $path = 'var/twoks_db.json'; $jsonString = file_get_contents($path); $jsonData = json_decode($jsonString, true); var_dump($jsonData); // Rappels pour écrire un fichier JSON en PHP $path = 'new-file.json'; $jsonString = json_encode($jsonData, JSON_PRETTY_PRINT); file_put_contents($path, $jsonString); ``` - Créez une classe `Twok` qui contient uniquement les attributs d'un `Twok` (ID, auteur, message, date). - Faites en sorte que la méthode `getTwokByID` de la classe `TwokManager` retourne une instance de la classe `Twok` et que la méthode `addTwok` prenne une instance de `Twok` en paramètre : ```php public function getTwokByID(int $id): Twok {} public function addTwok(Twok $twok): bool {} ``` - Vérfiez que votre service `TwokManager` et votre classe `Twok` sont accessibles par autowiring. ## Partie 2 : Création du Contrôleur et Routage (1 Heure) 1. **Création d'une Route de Base** : - Créer un contrôleur nommé `TweetTokController` avec une méthode `home` et créer une route `/home` qui pointe dessus. La méthode `home` affichera un message de bienvenu. 2. **Mise en Œuvre du Routage Dynamique** : - Dans le contrôleur `TweetTokController`, ajouter une méthode `showTwok` qui prend un ID en paramètre et affiche les détails du `Twok` pris dans le tableau fourni. - Créer une route `/twok/{id}` où `id` est un paramètre dynamique représentant un ID de `Twok` qui pointe sur la méthode `showTwok`. - Ajouter une exigence pour que `id` soit un entier. 3. **Injection de Dépendances et Conversion des Paramètres** : - Faites en sorte que la méthode `showTwok` du contrôleur `TweetTokController` fassent appel au service `TwokManager`. - Pour éviter d'avoir le nom du fichier JSON en dur dans le code, configurez son chemin comme argument dans le fichier `config/services.yaml`. 4. **Routage pour la méthode PUT** : - Ajoutez une méthode `addTwok` au contrôleur `TweetTokController` accessible via la route `/twok` en méthode PUT uniquement (attention aux priorités avec la route de la méthode `showTwok`). - Implémentez le contenu de la méthode `addTwok` du contrôleur `TweetTokController` pour qu'elle ajoute le `Twok` au fichier JSON. ## Pour aller plus loin : - **Débogage de Routage** : Utiliser la commande de console Symfony `debug:router` pour inspecter et déboguer les routes définies. - **Inspection du Conteneur de Services** : Explorer la commande `debug:container` pour comprendre comment les services sont configurés dans le conteneur. - Implémentez des jeux de test pour vos classes.