CHAPITRE 5:
LE CRUD AVEC LARAVEL
COURS FRAMEWORK WEB
Audiences:T-LSI-ADBD
Année-universitaire: 2024-2025
Enseignants responsables:
Nahla Haddar & Ahmed Fakhfakh
Application CRUD
 CRUD est un acronyme signifiant Create, Read,
Update and Delete.
 Il s'agit des 4 actions de base concernant la
persistante de données.
 Un contrôleur qui réalise toutes ces actions, est dit
contrôleur ressource.
2
Contrôleur ressource
 Pour une application CRUD, il contient les
méthodes suivantes:
◦ Pour l’action Create, il y en a deux méthodes:
 create(): pour envoyer un formulaire de création
 store(): pour enregistrer les données du formulaire dans un
nouveau enregistrement.
◦ Pour l’action Read, il y en a deux méthodes:
 index(): pour afficher une liste d’enregistrements (ex: produits)
 show(): pour afficher les données d’un enregistrement
◦ Pour l’action Update, il y en a deux méthodes:
 edit(): pour envoyer le formulaire de modification d’un
enregistrement.
 update(): pour enregistrer les données du formulaire de
modification.
◦ Pour l’action Delete, il y en a une seule méthode:
 destroy(): pour supprimer un enregistrement.
3
Créer un contrôleur ressource (1/2)
 Vous n'avez qu'à rajouter l'option--
resource lors de la création d'un nouveau
controller:
 De même, dans le fichier routes/web.php,
vous devez mentionner une route dite
« resource » pour ce contrôleur.
Route::resource(‘route_principale’, ‘NomDeMonController’)
◦ C’est suffisant pour créer une route vers chaque
méthode dans le contrôleur.
4
Créer un contrôleur ressource (2/2)
Exemple
 Création d’un contrôleur ressource:
Php artisan make:controller ProductController
--resource
 Les 7 méthodes créées couvrent la gestion complète
des produits:
◦ index( ): pour afficher la liste des produits,
◦ create() : pour envoyer le formulaire pour la création d’un
nouveau produit,
◦ store(Request $request) : pour créer un nouveau produit,
◦ show($id) : pour afficher les données d’un produit,
◦ edit($id) : pour envoyer le formulaire de modification d’un
produit,
◦ update(Request $request, $id) : pour modifier les données
d’un produit,
◦ destroy($id) : pour supprimer un produit.
5
Créer un contrôleur ressource (2/2)
Exemple
 Définir la route du contrôleur Resource:
◦ Dans le fichier routes/web.php, ajoutez la route
suivante:
◦ Vous pouvez vérifier les routes créées avec artisan
6
Rappel: méthodes de requête HTTP
 GET/ HEAD: demande une représentation de la
ressource spécifiée. Les requêtes GET/HEAD
doivent uniquement être utilisées afin de
récupérer des données.
 POST: est utilisée pour envoyer une entité vers la
ressource indiquée. Cela entraîne généralement
un changement d'état ou des effets de bord sur le
serveur
 PUT/PATCH: remplace toutes les représentations
actuelles de la ressource visée par le contenu de la
requête.
 DELETE: La méthode DELETE supprime la
ressource indiquée.
7
Modèle – Controller ressource
 Il existe une commande vous permettant de créer
à la fois un contrôleur ressource et son model
associé :
 Il est même possible de créer d'un coup le model
avec la migration et le contrôleur adapté:
◦ Créer le modèle directement dans le dossier App:
◦ Exemple:
8
DÉVELOPPEMENT D’UNE
APPLICATION CRUD
Aperçu du résultat final de l’application d’exemple:
9
Organisation du projet
 Tout d’abord, on va apprendre à organiser
notre projet:
◦ Les vues qui concerne la gestion des produits,
vont être enregistrées dans un dossier nommé
« products », créé sous « resources/views ».
◦ On va créer les vues suivantes:
 index.blade.php: affiche la liste des produits et les
actions .
 show.blade.php: affiche le détail d’un produit.
 create.blade.php: formulaire de création d’un produit.
 edit.blade.php: formulaire de modification d’un
produit.
10
Modèle-Migration-Resource (1/2)
 Créez d’un coup, le modèle avec la migration et le
contrôleur:
 php artisan make:model Product –mcr
 Définissez la migration:
 Lancez la migration:
◦ php artisan migrate
11
N’oubliez pas de définir la route du
contrôleur ProductController dans le
fichier web.php (voir diapo 6)
Modèle-Migration-Resource (2/2)
 Définissez les attributs modifiables dans le
modèle:
12
Créer un produit
Route
 Les routes: pour la création d’un produit
on va avoir deux routes :
◦ pour afficher le formulaire de création
◦ pour soumettre le formulaire
13
14
Créer un produit:
Vue create.blade.php (1/2)
Créer un produit:
Vue create.blade.php (2/2)
15
Créer un produit
Contrôleur
 Le contrôleur: dans le contrôleur ce sont les
méthodes create et store qui sont concernées.
◦ Méthode create() : pour afficher le formulaire de création
16
Créer un produit
Contrôleur
 Méthode store(): pour sauvegarder les saisies
17
En cas de succès, redirection vers la vue index, et envoie
de la variable de session ($info)
Explication: Validation du
formulaire
 La variable $validatedData contient un tableau
associatif des données validées.
 Elle inclut uniquement les champs qui ont passé
les règles de validation définies dans votre
contrôleur.
 Ce tableau est prêt à être utilisé pour des actions
comme l'enregistrement dans la base de données.
 Si les données sont invalides :
◦ Laravel redirigera automatiquement l'utilisateur vers la
page précédente avec :
 Les erreurs de validation accessibles via $errors.
 Les anciennes valeurs via old().
 Cela permet à l'utilisateur de corriger les erreurs
sans tout ressaisir.
18
Créer un produit:
Vue create.blade.php (2/2)
19
Redirection et variable de session
flash
• Syntaxe de la méthode redirect():
• redirect(‘route’): pour rediriger vers une route
• Ou redirect()->route(‘nom_route’): pour rediriger
vers une route nommée
 L’objectif ici est de rediriger l’utilisateur vers la page
index.blade.php (donc vers la route nommée
« products.index »), et d’envoyer une variable qui
affiche un message de succès d’insertion.
 Le problème c’est quoi?
◦ On ne peut pas passer cette variable comme paramètre de cette
route !
 Utiliser les sessions flash: ces variables existeront
l'instant d'une seule requête HTTP (une seule
redirection)
• Associer une variable de session flash à la redirection:
• Utilisez la méthode with(‘variable’, ‘contenu’)
20
Liste des produits
 Vue finale:
21
La liste des produits
Route - contrôleur
 La route: la liste des produits correspond à cette
route :
 Le contrôleur: dans le contrôleur c’est la
méthode index qui est concernée. On va donc la
coder :
22
$products est un tableau d‘objets de type « Product »
La liste des produits:
Vue index.blade.php (1/2)
23
Affichage de la variable de session
flash, s’il est associé à la requête
La liste des produits:
Vue index.blade.php (2/2)
24
La liste des produits:
Explication de la vue index (1/2)
 On utilise la directive @foreach pour faire une boucle sur touts
les produits.
 La méthode route génère une url selon le nom de la route, peut
être accompagnée d’un paramètre, par exemple, le bouton
« voir », est associé à la route:
 La méthode route(‘products.show’, $product) permet de
générer l’url de la forme …/products/id
◦ Grâce à la liaison implicite (Implicit Bindind), Laravel va sélectionner
l’instance du modèle Product, relative à ce id, et il va l’envoyer à la
méthode show comme paramètre.
◦ Notez-bien! Pour que ça fonctionne correctement, il faut
que l’identifiant de la table « products » soit nommé
« id »
25
La liste des produits:
Explication de la vue index (2/2)
 Pour l’action Delete:
◦ Les formulaire HTML ne supportent pas les
verbes PUT, PATCH et DELETE, du coup on doit
utiliser le verbe POST et prévoir dans le formulaire
un input caché qui indique le verbe à utiliser en
réalité, la directive @method(‘DELETE’) permet
facilement de mettre ça en place, on s’en sert pour
le bouton de suppression.
26
La pagination
 Imaginez qu’on en ait des centaines ou des milliers de
produits!
 Dans ce cas une pagination serait la bienvenue.
 Au niveau du contrôleur (dans la méthode index):
◦ On va remplacé la méthode all par paginate en indiquant en
paramètre le nombre d’enregistrement à afficher par page.
◦ $products= Product::paginate(5);
 Ensuite dans la vue index, il suffit d’ajouter ce code
juste avant @endsection :
◦ {{$products->links("pagination::bootstrap-5")}}
 On aura:
27
CM1
Diapositive 27
CM1 Le résultat est un objet paginé qui contient les informations suivantes :
data : Les enregistrements pour la page actuelle.
total : Le nombre total d'enregistrements.
per_page : Le nombre d'éléments par page.
current_page : Le numéro de la page actuelle.
last_page : Le numéro de la dernière page.
next_page_url : L'URL de la page suivante (ou null si c'est la dernière page).
prev_page_url : L'URL de la page précédente (ou null si c'est la première page).
Compte Microsoft; 10/12/2024
Zone de recherche simple
 Route:
 View: dans le navbar
 Contrôleur:
28
Affichage du détail d’un produit
Contrôleur
 En cliquant sur le bouton « voir » dans la vue
index, c’est la méthode show du contrôleur
ProductController qui est concernée par l’affichage
du détail, elle doit recevoir le paramètre $product
 Dans ProductController, spécifiquement, dans la
méthode show($id), modifiez le paramètre $id par
une instance du modèle Product $product
29
La méthode show() appelle la vue show.blade.php et lui
envoie l’objet $product pour afficher ses détails
Affichage du détail d’un produit
Vue show.blade.php
30
Supprimer un produit
 La route:
 Le contrôleur: dans le contrôleur c’est la
méthode destroy qui est concernée.
◦ On a l’objet product, donc on va juste lui appliquer la
méthode destroy() d’Eloquent pour le supprimer de la
BD.
31
Comment garantir que ce produit n’est pas entrain
d’être modifié par un autre utilisateur connecté ?
Solution: utiliser le verrouillage
pessimiste
 Qu'est-ce qu'un verrouillage pessimiste ?
◦ Le verrouillage pessimiste bloque l'accès à une
ligne ou à un ensemble de lignes dans une table
pour d'autres transactions tant que la
transaction courante n'est pas terminée.
◦ Cela garantit qu'aucune autre transaction ne
peut :
 Modifier les données (avec lockForUpdate()).
 Lire les données de manière incohérente (avec
sharedLock()).
32
Solution: utiliser le verrouillage
pessimiste
 Quand utiliser un verrouillage pessimiste lors
de la suppression ?
◦ Si plusieurs utilisateurs ou processus peuvent accéder au
même enregistrement simultanément.
◦ Si vous voulez éviter que des données soient modifiées
ou supprimées en même temps.
◦ Si la base de données doit garantir une stricte cohérence
des données, par exemple, dans une application
financière.
 Bases de données supportées:
◦ MySQL, PostgreSQL
33
Solution: utiliser le verrouillage
pessimiste
 Comment mettre en œuvre un
verrouillage pessimiste lors de la
suppression ?
◦ Utilisation de lockForUpdate(): Cette méthode
place un verrou d'écriture sur l'enregistrement,
empêchant d'autres processus ou transactions
de le modifier ou de le supprimer jusqu'à la fin
de la transaction.
34
Méthode destroy() avec
verrouillage pessimiste
35
Modifier un produit
Route et Contrôleur
 Les routes: pour la modification d’un produit, on
va avoir deux routes :
◦ pour afficher le formulaire de modification
◦ pour soumettre le formulaire
 Le contrôleur: dans le contrôleur ce sont les
méthodes edit et update qui sont concernées.
◦ Dans la vue index, on a passé au contrôleur, comme
paramètre de la méthode edit, l’objet Product concerné
par la modification,
36
Modifier un produit
Vue edit.blade.php
37
Modifier un produit
Vue edit.blade.php (suite)
38
Modifier un produit
Contrôleur (update avec verrouillage
pessimiste)
39
Modifier un produit
Contrôleur (update avec verrouillage
pessimiste)
40
Suite de la fonction update…

ch5 - Le CRUD avec Laravel , aaa aaa aaa

  • 1.
    CHAPITRE 5: LE CRUDAVEC LARAVEL COURS FRAMEWORK WEB Audiences:T-LSI-ADBD Année-universitaire: 2024-2025 Enseignants responsables: Nahla Haddar & Ahmed Fakhfakh
  • 2.
    Application CRUD  CRUDest un acronyme signifiant Create, Read, Update and Delete.  Il s'agit des 4 actions de base concernant la persistante de données.  Un contrôleur qui réalise toutes ces actions, est dit contrôleur ressource. 2
  • 3.
    Contrôleur ressource  Pourune application CRUD, il contient les méthodes suivantes: ◦ Pour l’action Create, il y en a deux méthodes:  create(): pour envoyer un formulaire de création  store(): pour enregistrer les données du formulaire dans un nouveau enregistrement. ◦ Pour l’action Read, il y en a deux méthodes:  index(): pour afficher une liste d’enregistrements (ex: produits)  show(): pour afficher les données d’un enregistrement ◦ Pour l’action Update, il y en a deux méthodes:  edit(): pour envoyer le formulaire de modification d’un enregistrement.  update(): pour enregistrer les données du formulaire de modification. ◦ Pour l’action Delete, il y en a une seule méthode:  destroy(): pour supprimer un enregistrement. 3
  • 4.
    Créer un contrôleurressource (1/2)  Vous n'avez qu'à rajouter l'option-- resource lors de la création d'un nouveau controller:  De même, dans le fichier routes/web.php, vous devez mentionner une route dite « resource » pour ce contrôleur. Route::resource(‘route_principale’, ‘NomDeMonController’) ◦ C’est suffisant pour créer une route vers chaque méthode dans le contrôleur. 4
  • 5.
    Créer un contrôleurressource (2/2) Exemple  Création d’un contrôleur ressource: Php artisan make:controller ProductController --resource  Les 7 méthodes créées couvrent la gestion complète des produits: ◦ index( ): pour afficher la liste des produits, ◦ create() : pour envoyer le formulaire pour la création d’un nouveau produit, ◦ store(Request $request) : pour créer un nouveau produit, ◦ show($id) : pour afficher les données d’un produit, ◦ edit($id) : pour envoyer le formulaire de modification d’un produit, ◦ update(Request $request, $id) : pour modifier les données d’un produit, ◦ destroy($id) : pour supprimer un produit. 5
  • 6.
    Créer un contrôleurressource (2/2) Exemple  Définir la route du contrôleur Resource: ◦ Dans le fichier routes/web.php, ajoutez la route suivante: ◦ Vous pouvez vérifier les routes créées avec artisan 6
  • 7.
    Rappel: méthodes derequête HTTP  GET/ HEAD: demande une représentation de la ressource spécifiée. Les requêtes GET/HEAD doivent uniquement être utilisées afin de récupérer des données.  POST: est utilisée pour envoyer une entité vers la ressource indiquée. Cela entraîne généralement un changement d'état ou des effets de bord sur le serveur  PUT/PATCH: remplace toutes les représentations actuelles de la ressource visée par le contenu de la requête.  DELETE: La méthode DELETE supprime la ressource indiquée. 7
  • 8.
    Modèle – Controllerressource  Il existe une commande vous permettant de créer à la fois un contrôleur ressource et son model associé :  Il est même possible de créer d'un coup le model avec la migration et le contrôleur adapté: ◦ Créer le modèle directement dans le dossier App: ◦ Exemple: 8
  • 9.
    DÉVELOPPEMENT D’UNE APPLICATION CRUD Aperçudu résultat final de l’application d’exemple: 9
  • 10.
    Organisation du projet Tout d’abord, on va apprendre à organiser notre projet: ◦ Les vues qui concerne la gestion des produits, vont être enregistrées dans un dossier nommé « products », créé sous « resources/views ». ◦ On va créer les vues suivantes:  index.blade.php: affiche la liste des produits et les actions .  show.blade.php: affiche le détail d’un produit.  create.blade.php: formulaire de création d’un produit.  edit.blade.php: formulaire de modification d’un produit. 10
  • 11.
    Modèle-Migration-Resource (1/2)  Créezd’un coup, le modèle avec la migration et le contrôleur:  php artisan make:model Product –mcr  Définissez la migration:  Lancez la migration: ◦ php artisan migrate 11 N’oubliez pas de définir la route du contrôleur ProductController dans le fichier web.php (voir diapo 6)
  • 12.
    Modèle-Migration-Resource (2/2)  Définissezles attributs modifiables dans le modèle: 12
  • 13.
    Créer un produit Route Les routes: pour la création d’un produit on va avoir deux routes : ◦ pour afficher le formulaire de création ◦ pour soumettre le formulaire 13
  • 14.
    14 Créer un produit: Vuecreate.blade.php (1/2)
  • 15.
    Créer un produit: Vuecreate.blade.php (2/2) 15
  • 16.
    Créer un produit Contrôleur Le contrôleur: dans le contrôleur ce sont les méthodes create et store qui sont concernées. ◦ Méthode create() : pour afficher le formulaire de création 16
  • 17.
    Créer un produit Contrôleur Méthode store(): pour sauvegarder les saisies 17 En cas de succès, redirection vers la vue index, et envoie de la variable de session ($info)
  • 18.
    Explication: Validation du formulaire La variable $validatedData contient un tableau associatif des données validées.  Elle inclut uniquement les champs qui ont passé les règles de validation définies dans votre contrôleur.  Ce tableau est prêt à être utilisé pour des actions comme l'enregistrement dans la base de données.  Si les données sont invalides : ◦ Laravel redirigera automatiquement l'utilisateur vers la page précédente avec :  Les erreurs de validation accessibles via $errors.  Les anciennes valeurs via old().  Cela permet à l'utilisateur de corriger les erreurs sans tout ressaisir. 18
  • 19.
    Créer un produit: Vuecreate.blade.php (2/2) 19
  • 20.
    Redirection et variablede session flash • Syntaxe de la méthode redirect(): • redirect(‘route’): pour rediriger vers une route • Ou redirect()->route(‘nom_route’): pour rediriger vers une route nommée  L’objectif ici est de rediriger l’utilisateur vers la page index.blade.php (donc vers la route nommée « products.index »), et d’envoyer une variable qui affiche un message de succès d’insertion.  Le problème c’est quoi? ◦ On ne peut pas passer cette variable comme paramètre de cette route !  Utiliser les sessions flash: ces variables existeront l'instant d'une seule requête HTTP (une seule redirection) • Associer une variable de session flash à la redirection: • Utilisez la méthode with(‘variable’, ‘contenu’) 20
  • 21.
    Liste des produits Vue finale: 21
  • 22.
    La liste desproduits Route - contrôleur  La route: la liste des produits correspond à cette route :  Le contrôleur: dans le contrôleur c’est la méthode index qui est concernée. On va donc la coder : 22 $products est un tableau d‘objets de type « Product »
  • 23.
    La liste desproduits: Vue index.blade.php (1/2) 23 Affichage de la variable de session flash, s’il est associé à la requête
  • 24.
    La liste desproduits: Vue index.blade.php (2/2) 24
  • 25.
    La liste desproduits: Explication de la vue index (1/2)  On utilise la directive @foreach pour faire une boucle sur touts les produits.  La méthode route génère une url selon le nom de la route, peut être accompagnée d’un paramètre, par exemple, le bouton « voir », est associé à la route:  La méthode route(‘products.show’, $product) permet de générer l’url de la forme …/products/id ◦ Grâce à la liaison implicite (Implicit Bindind), Laravel va sélectionner l’instance du modèle Product, relative à ce id, et il va l’envoyer à la méthode show comme paramètre. ◦ Notez-bien! Pour que ça fonctionne correctement, il faut que l’identifiant de la table « products » soit nommé « id » 25
  • 26.
    La liste desproduits: Explication de la vue index (2/2)  Pour l’action Delete: ◦ Les formulaire HTML ne supportent pas les verbes PUT, PATCH et DELETE, du coup on doit utiliser le verbe POST et prévoir dans le formulaire un input caché qui indique le verbe à utiliser en réalité, la directive @method(‘DELETE’) permet facilement de mettre ça en place, on s’en sert pour le bouton de suppression. 26
  • 27.
    La pagination  Imaginezqu’on en ait des centaines ou des milliers de produits!  Dans ce cas une pagination serait la bienvenue.  Au niveau du contrôleur (dans la méthode index): ◦ On va remplacé la méthode all par paginate en indiquant en paramètre le nombre d’enregistrement à afficher par page. ◦ $products= Product::paginate(5);  Ensuite dans la vue index, il suffit d’ajouter ce code juste avant @endsection : ◦ {{$products->links("pagination::bootstrap-5")}}  On aura: 27 CM1
  • 28.
    Diapositive 27 CM1 Lerésultat est un objet paginé qui contient les informations suivantes : data : Les enregistrements pour la page actuelle. total : Le nombre total d'enregistrements. per_page : Le nombre d'éléments par page. current_page : Le numéro de la page actuelle. last_page : Le numéro de la dernière page. next_page_url : L'URL de la page suivante (ou null si c'est la dernière page). prev_page_url : L'URL de la page précédente (ou null si c'est la première page). Compte Microsoft; 10/12/2024
  • 29.
    Zone de recherchesimple  Route:  View: dans le navbar  Contrôleur: 28
  • 30.
    Affichage du détaild’un produit Contrôleur  En cliquant sur le bouton « voir » dans la vue index, c’est la méthode show du contrôleur ProductController qui est concernée par l’affichage du détail, elle doit recevoir le paramètre $product  Dans ProductController, spécifiquement, dans la méthode show($id), modifiez le paramètre $id par une instance du modèle Product $product 29 La méthode show() appelle la vue show.blade.php et lui envoie l’objet $product pour afficher ses détails
  • 31.
    Affichage du détaild’un produit Vue show.blade.php 30
  • 32.
    Supprimer un produit La route:  Le contrôleur: dans le contrôleur c’est la méthode destroy qui est concernée. ◦ On a l’objet product, donc on va juste lui appliquer la méthode destroy() d’Eloquent pour le supprimer de la BD. 31 Comment garantir que ce produit n’est pas entrain d’être modifié par un autre utilisateur connecté ?
  • 33.
    Solution: utiliser leverrouillage pessimiste  Qu'est-ce qu'un verrouillage pessimiste ? ◦ Le verrouillage pessimiste bloque l'accès à une ligne ou à un ensemble de lignes dans une table pour d'autres transactions tant que la transaction courante n'est pas terminée. ◦ Cela garantit qu'aucune autre transaction ne peut :  Modifier les données (avec lockForUpdate()).  Lire les données de manière incohérente (avec sharedLock()). 32
  • 34.
    Solution: utiliser leverrouillage pessimiste  Quand utiliser un verrouillage pessimiste lors de la suppression ? ◦ Si plusieurs utilisateurs ou processus peuvent accéder au même enregistrement simultanément. ◦ Si vous voulez éviter que des données soient modifiées ou supprimées en même temps. ◦ Si la base de données doit garantir une stricte cohérence des données, par exemple, dans une application financière.  Bases de données supportées: ◦ MySQL, PostgreSQL 33
  • 35.
    Solution: utiliser leverrouillage pessimiste  Comment mettre en œuvre un verrouillage pessimiste lors de la suppression ? ◦ Utilisation de lockForUpdate(): Cette méthode place un verrou d'écriture sur l'enregistrement, empêchant d'autres processus ou transactions de le modifier ou de le supprimer jusqu'à la fin de la transaction. 34
  • 36.
  • 37.
    Modifier un produit Routeet Contrôleur  Les routes: pour la modification d’un produit, on va avoir deux routes : ◦ pour afficher le formulaire de modification ◦ pour soumettre le formulaire  Le contrôleur: dans le contrôleur ce sont les méthodes edit et update qui sont concernées. ◦ Dans la vue index, on a passé au contrôleur, comme paramètre de la méthode edit, l’objet Product concerné par la modification, 36
  • 38.
    Modifier un produit Vueedit.blade.php 37
  • 39.
    Modifier un produit Vueedit.blade.php (suite) 38
  • 40.
    Modifier un produit Contrôleur(update avec verrouillage pessimiste) 39
  • 41.
    Modifier un produit Contrôleur(update avec verrouillage pessimiste) 40 Suite de la fonction update…