0% ont trouvé ce document utile (0 vote)
10 vues9 pages

Cours Développement Web (1MPSSR) : TP4: Le CRUD D'une Table Dans La BD

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1/ 9

Cours Développement Web (1MPSSR)

TP4 : Le CRUD d’une table dans la BD


L’objectif de ce TP est d’implémenter toutes les ressources nécessaires (Migration, Model,
Factory, Seeder, Contrôleur et vues) pour gérer les données dans une table générée dans la BD.
Le TP3 précédent est considéré comme un prérequis de celui-ci.
Les données
On va considérer l’exemple d’une table dans la BD nommée films ayant la structure suivante :

migration : définir la structure de la bd


modele: pour la manipilation des donnés dans la table

1. Exécuter la commande qui permet de créer le Model Film avec sa migration.


2. Editer le fichier de migration et dans la fonction up() ajouter à la table les 4 attributs
titre, anneesortie, description et duree ayant respectivement les types
string(), year(), text() et integer().
3. lancer la commande de migration, vous devez obtenir la table films avec la structure ci-
dessus.
4. Indiquer dans le Model Film que ces 4 attributs peuvent être remplis (fillable) et modifiés
par l’utilisateur.
La population
Pour l’instant la table films est vide, on va la remplir (par une population de faux données) en
générant aléatoirement des enregistrements. Pour cela on va créer un factory (usine qui
fabrique la population) :
> php artisan make:factory FilmFactory
Une classe FilmFactory est créée dans le dossier database/factories.
Ajouter dans la fonction definition le code suivant :

A. Ajroud 1 A.U. 22/23


fonction va retourner un tab associative

haja ghalta ma3neha


ma3neha titre heka va contenir 2 mot
ma3neha mich yekhou paragraphe
aléatoire ou y7otha fil colonne
description

Explication :
sentence(2, true): génère une phrase contenant au moins 2 mots.
year : génère une valeur d’année
paragraph(): génère un paragraphe par défaut de 3 phrases.
numberBetween(45,200): génère un nombre aléatoire dans cet intervalle.

Le seeder est une classe qui permet de définir la taille de la population. Allez au fichier
database/seeds/DatabaseSeeder.php et modifier le code de la fonction run pour
générer 10 films aléatoires dans la table films (inspirer vous de l’instruction commentée).
Il ne reste plus qu’à lancer la population avec la commande :
> php artisan db:seed
Si tout va bien on se retrouve avec 10 films dans la table films.
Les Contrôleurs et les routes
On va maintenant créer un contrôleur dit de ressource. Ce contrôleur contiendra par défaut
la définition vide des fonctions CRUD sur une table.
> php artisan make:controller FilmController --resource
Les 7 méthodes créées couvrent la gestion complète des films :
• index : pour afficher la liste des films,
• create : pour envoyer le formulaire pour la création d’un nouveau film,
• store : pour créer un nouveau film,
• show : pour afficher les données d’un film,
• edit : pour envoyer le formulaire pour la modification d’un film,
• update : pour modifier les données d’un film,
• destroy : pour supprimer un film.
Pour créer toutes les routes il suffit d’ajouter cette unique ligne dans le fichier web.php :
(n’oublier pas d’importer la classe de FilmController) :
Route::resource('films', FilmController::class);
Vérifions ce qui est généré comme route avec la commande qui liste toutes les routes :
> php artisan route:list

A. Ajroud 2 A.U. 22/23


Vous trouvez 7 routes, avec chacune une méthode et une url, qui pointent sur les 7 méthodes
du contrôleur. Notez également que chaque route a aussi un nom qui peut être utilisé par
exemple pour une redirection.
La validation d’un Film
1. Lancer la commande pour créer une requête de formulaire (validation) pour la création ou
la modification d’un film.
2. Ajouter dans la fonction rules les règles de validation suivantes :

N’oublier pas de retourner true dans la fonction authorize().


Action d’affichage de la liste des films
La route de l’affichage d’un film correspond à la première dans la liste précédente. Dans le
contrôleur c’est la méthode index qui est concernée. On va donc la coder comme suit :

pour récupérer tout les donnés eli mawjoudin fil tab Film ou n7otouhom
fi variable $films

convertion de la liste des films dans un tableau films => $films


clé
On va chercher tous les films avec la méthode all du modèle, on appelle la vue index en lui
transmettant la liste films convertie dans un tableau par la méthode compact.

compact('films')=films=>$films

A. Ajroud 3 A.U. 22/23


fih des zones nbadalhom min pages el page (min vue eli vue)
@yiled ma3neha zone eli nbadalha min vue el vue
l'élément section : bech ndefini fih haja zeyda mich defini fi
La vue index template

Créer la vue index.blade.php qui hérite de template.blade.php qui va afficher


dans un tableau HTML le id et le titre des films issus de la table (les autres attributs seront
affichés dans une autre vue nommée detail).
En utilisant la syntaxe de la structure itérative pour parcourir une liste et afficher les attributs
de leurs éléments :
for ($Films as $films ) ma3neha mich nparcouri les films
@foreach($liste as $element) eli fil Films fi kol ittération mich nekhou film
{{$element->attribut}}
@endforeach
Réaliser l’affichage suivant dans la vue index :

Ajouter devant chaque titre de films un lien hypertexte Détail permettant d’afficher le détail
de chaque film :
<td>
non de la route
<a href="{{ route('films.show', $film->id) }}" class="btn btn-
primary" >Détails</a>
</td>
Ce lien génère une requête HTTP envoyé par get vers la route nommé films.show en lui
transmettant l’id du film. Ceci permettra de générer l’url de la forme …/films/id
Action Détail
Dans le contrôleur c’est la méthode show qui est concernée. On va donc la coder.
Il faut toutefois préciser un point important. Dans la version du contrôleur générée par défaut
on voit que le film, dans la fonction show, est référencé par son identifiant :
public function show($id)
La variable id contient la valeur passée dans l’url, Par exemple …/films/8. Il suffit donc
ensuite d’aller chercher dans la base le film correspondant.

A. Ajroud 4 A.U. 22/23


On va utiliser une autre stratégie :
public function show(Film $film)
L’argument cette fois est une instance du modèle Film. Etant donné qu’il rencontre ce type,
Laravel va automatiquement livrer une instance du modèle pour le film concerné ! C’est ce
qu’on appelle liaison implicite (Implicit Binding). Finalement voici le code de la fonction show :
public function show(Film $film)
{
return view('show', compact('film'));
} la recherche implicite: yemchi ylawej 3ala film eli id
mte3ou 3 par exmp fi 3oudh mana3mel $film=film::find($)
La vue show ya3malhom toul
Créer la vue show.blade.php qui hérite de template.blade.php qui va afficher le
détail (année de sortie, description et durée) du film qui lui est passé.

Action de suppression
La suppression d’un film correspond à cette route :

Dans la vie index, ajouter devant chaque bouton détail, un formulaire web dont l’action
pointe vers cette route et sa méthode est delete (envoyée comme paramètre de la requête) :

Dans FilmController c’est la fonction destroy qui actionne la suppression :

Comme pour la méthode show on utilise une liaison implicite et on obtient immédiatement
une instance du modèle.

A. Ajroud 5 A.U. 22/23


Après la suppression il faut afficher quelque chose pour dire que l’opération s’est réalisée
correctement. On utilise une redirection avec la méthode back qui renvoie la même vue
(index). D’autre part la méthode with permet de flasher une information dans la session.
Cette information ne sera valide que pour la requête suivante. Dans la vue index il faut
prévoir quelque chose pour afficher cette information :
@section('contenu')
@if(session()->has('info'))
{{ session('info') }}
@endif
...
La directive @if permet de déterminer si une information est présente en session.
Pour améliorer son apparence, appliquer les classes Bootstrap5 nécessaires pour que cet
affichage apparaît comme une alerte qu’on peut fermer.

Suivez ce lien pour plus d’information :


https://www.w3schools.com/bootstrap5/bootstrap_alerts.php
Ajouter dans le code HTML du bouton supprimer, l’événement JS onclick pour afficher la boite
de confirmation :
onclick="return confirm(’Voulez vous vraiment supprimer ce film ?’)"
Action d’ajout
Pour la création d’un film on va avoir deux routes (comme pour l’ajout d’un contact en TP3) :
- une pour afficher le formulaire de création
- une pour soumettre le formulaire
De ce fait, dans le contrôleur ce sont les méthodes create et store qui sont concernées.

A. Ajroud 6 A.U. 22/23


La fonction store , après la validation du film, va faire sa création à partir de tous les valeurs
des champs reçus. Ensuite on va rediriger la réponse vers la route nommée films.index
pour afficher la liste des films avec un message de confirmation.
Ajouter dans la vue index, un lien hypertexte vers la route qui exécute la fonction create
Pour afficher le formulaire d’ajout.
Il reste maintenant à développer la vue create.blade.php qui hérite de la template et
affiche un formulaire d’ajout pour un nouveau film composé de 4 champs pour le titre, l’année
de sortie, description et durée (adopter le type de l’input selon la donnée saisie).
Action de modification
Tout comme la création, la modification d’un film utilise deux routes :
• Une pour afficher le formulaire de modification
• Une pour soumettre le formulaire
Dans le contrôleur ce sont les méthodes edit et update qui sont concernées. On va donc
les coder :

Question : A quoi correspond l’objet $film argument de la fonction update ?

Ajouter dans la vue index.blade.php un lien hypertexte Modifier qui pointe vers la route
qui appelle la méthode edit.
La vue edit.blade.php est identique à celle de create avec quelques modifications :
• L’action du formulaire change par la route : route('films.update', $film->id)
• La requête de modification est envoyée par put, donc ajouter ceci dans le code du formulaire :
@method('put')
• Les champs sont remplis par les attributs d’un film, par exemple :
value="{{ old('titre', $film->titre) }}"
Créer la vue edit.blade.php et tester l’action de modification d’un film.
La pagination
La pagination consiste à découper une liste de données à afficher dans une vue en plusieurs
pages avec la possibilité de naviguer dans ces pages grâce à une barre de navigation.

A. Ajroud 7 A.U. 22/23


Laravel permet d’appliquer simplement la pagination grâce à deux méthodes paginate()
appliquée dans un contrôleur et links() appliquée dans une vue.
Dans FilmController modifier l’action index pour diviser la liste des films en plusieurs
page (contenant chacune 5 films par exemple) :

Dans la vue index.blade.php ajouter après le tableau HTML l’affichage de la barre de


navigation :

Pour appliquer les styles Bootstrap sur cette barre, on va modifier le code de la méthode
boot() de la classe App\Providers\AppServiceProvider :

Sans oublier d’ajouter l’importation :

En actualisant l’affichage de la vue index on obtient l’aperçu suivant :

A. Ajroud 8 A.U. 22/23


La recherche des films par nom
On souhaite effectuer la recherche des films par titre ou une partie d’un titre.
1. Ajouter dans la vue index le code du formulaire de recherche selon l’aperçu suivant :

Ce formulaire aura comme méthode get et l’action vers une route nommée films.find.
2. Créer dans le fichier web.php la route nommée films.find qui pointe sur une action
nommée find dans FilmController.
3. Ajouter l’action find dans FilmController dans laquelle on cherche la liste des films
selon le titre reçu dans la requête envoyée puis les paginer pour les envoyer à la vue index.
Voici comment rechercher les films par titre en utilisant l’opérateur like :

A. Ajroud 9 A.U. 22/23

Vous aimerez peut-être aussi