Laravel
Laravel
Laravel
ISMONTIC TANGER
DÉVELOPPER EN BACK-END
OUAFIQ Majda
2022-2023
Découvrir les notions fondamentales
des Frameworks PHP
Présentation des Frameworks PHP
Un Framework est une boite à outils pour aider les développeurs dans la réalisation
de leurs tâches. Frame (cadre ) et work (travail).
Un Framework contient des composants autonomes qui permettent de résoudre les
problèmes souvent rencontrés par les développeurs (CRUD, arborescence, normes,
sécurités, etc.).
Les Frameworks PHP les plus populaires
Découvrir les notions fondamentales
des Frameworks PHP
Le framework Laravel
Lancé en 2011, Laravel se trouve en tête des classements grâce à ses fonctionnalités:
Offre une solution MVC complète.
a son propre ORM « Eloquent ORM » .
Utilise le moteur de templating Blade.
Packalyst, une collection de paquets Laravel, compte plus de 15 000 paquets
utilisable .
Dispose de l’outil de ligne de commande Artisan Console qui permet d’automatiser
les tâches répétitives et de générer rapidement du code squelette.
Dispose de plusieurs outils utiles tels que Mix pour la compilation des actifs CSS et
JS, et Socialite pour l’authentification OAuth.
Bénéficie d’une large communauté de développeurs
Découvrir les notions fondamentales
des Frameworks PHP
L’architecture MVC
Les frameworks PHP suivent généralement le plus célèbres design patterns qui
s'appelle MVC, qui signifie Modèle - Vue - Contrôleur.
Le but du pattern MVC est de séparer la logique du code en trois parties que l'on
retrouve dans des fichiers distincts.
Modèle : cette partie gère la logique métier. Le modèle communique avec la BDD.
C’est lui qui s’occupe de récupérer un article en base par exemple. On y trouve des
algorithmes complexes et des requêtes SQL.
Vue : cette partie se concentre sur l'affichage. Elle affiche à l’utilisateur des données
contenues dans des variables. On y trouve essentiellement du code HTML mais aussi
quelques boucles et conditions PHP très simples.
Découvrir les notions fondamentales
des Frameworks PHP
Contrôleur : cette partie gère les échanges avec l'utilisateur. C'est en quelque sorte
l'intermédiaire entre l'utilisateur, le modèle et la vue. Le modèle lui transmet les
données récupérées en base de données, puis il transmet ces données à la vue.
Préparer l’environnement de Laravel
Installation des outils pour Laravel
Pour travailler avec Laravel, vous avez besoin de :
1. PHP (PHP 8.X pour Laravel 9, PHP 7.4 pour Laravel 8).
2. un serveur Local (Apache ou Nginx), permettant l’exécution du PHP
3. un serveur de base de données pour gérer vos bases de données.
4. Composer, un gestionnaire de dépendances pour PHP
5. IDE et Editeurs de code ( Visual Studio Code, Atom, PHPStorm …)
6. Navigateurs Web : Laravel est compatible sur tout les navigateurs récents
(Chrome, Firefox ou Safari)
Préparer l’environnement de Laravel
Composer
Composer est un logiciel gestionnaire de dépendances libre
écrit en PHP. Il permet à ses utilisateurs de déclarer et d'installer
les bibliothèques dont le projet principal a besoin. Il permet de
télécharger et de mettre à jour des bibliothèques externes.
Les bibliothèques externes permettent de réutiliser le code écrit
par d'autres personnes pour simplifier le développement.
Composer permet également de créer des projets Laravel et de télécharger le
framework.
Préparer l’environnement de Laravel
Installation de Composer
Pour installer Composer, il suffit de télécharger un installeur
https://getcomposer.org/download/ et téléchargez Composer-Setup.exe.
Vérifications
Pour vérifier que tout fonctionne exécuter composer sur la ligne de commande
comme suit:
Préparer l’environnement de Laravel
Créer un nouveau projet Laravel
Méthode 1 : Utiliser l’installeur de Laravel
Installer Laravel dans notre ordinateur : Ouvrez votre terminal (invite de commande)
et tapez la ligne suivante:
Les autres fichiers concernent des routes plus spécifiques comme pour les API avec
le fichier api.php ou les routes pour les actions en ligne de commande avec le fichier
console.php.
C’est avec ce fichier que la requête va être analysée et dirigée. Regardons ce qu’on y
trouve au départ : Route::get('/', function () {
return view('welcome');
});
Gestion du routage
Comme Laravel est explicite vous pouvez déjà deviner à quoi sert ce code :
Route : on utilise le routeur,
get : on regarde si la requête a la méthode « get »,
‘/’ : on regarde si l’url comporte uniquement le nom de domaine,
dans la fonction anonyme on retourne (return) une vue (view) à partir du fichier
« welcome ».
Ce fichier « welcome » se trouve bien rangé dans le dossier des vues :
C’est ce fichier comportant du code Html qui génère le texte d’accueil que vous
obtenez au démarrage initial de Laravel.
Gestion du routage
Visualisons le cycle de la requête :
Gestion du routage
Méthodes de routeur disponibles
Laravel accepte les verbes suivants : get, post, put, patch, delete, options, match
(pour prévoir plusieurs verbes) et any (on accepte tous les verbes).
Il est indispensable de connaître les principales méthodes du HTTP :
GET : pour récupérer des données
POST : pour envoyer des données
PUT : pour mettre à jour des données
PATCH : pour mettre à jour partiellement des données
DELETE : pour supprimer des données
OPTIONS : pour obtenir les options de communication avec une ressource
MATCH : pour prévoir plusieurs verbes (GET, POST, PUT, PATCH, DELETE)
ANY : pour accepter tous les verbes HTTP.
Gestion du routage
Méthodes de routeur disponibles
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Parfois, vous devrez peut-être enregistrer une route qui répond à plusieurs verbes
HTTP. Vous pouvez le faire en utilisant la méthode match. Ou, vous pouvez même
enregistrer une route qui répond à tous les verbes HTTP en utilisant la méthode any :
Route::match(['get', 'post'], '/', function () {//…});
Route::any('/', function () {//… });
Gestion du routage
Plusieurs routes et paramètre de route:
A l’installation Laravel a une seule route qui correspond à l’url de base composée
uniquement du nom de domaine. Voyons maintenant comment créer d’autres routes.
Imaginons que nous ayons 3 pages qui doivent être affichées avec ces urls :
1. http://monsite.fr/page/1
2. http://monsite.fr/page/2
3. http://monsite.fr/page/3
Il est facile de réaliser cela avec ce code :
Route::get(‘page/1', function() { return 'Je suis la page 1 !'; });
Route::get('page/2', function() { return 'Je suis la page 2 !'; });
Route::get('page/3', function() { return 'Je suis la page 3 !'; });
Gestion du routage
Cette fois je n’ai pas créé de vue parce que ce qui nous intéresse est uniquement une
mise en évidence du routage, je retourne donc directement la réponse au client.
Visualisons cela pour la page 1 :
On dit que la route est paramétrée parce qu’elle possède un paramètre qui peut
prendre n’importe quelle valeur.
On peut rendre un paramètre optionnel en lui ajoutant un point d’interrogation. Dans
ce cas pour éviter une erreur d’exécution il faut prévoir une valeur par défaut pour le
paramètre, par exemple : Route::get('{n?}', function($n = 1) {
Gestion du routage
Redirection
Si vous définissez une route qui redirige vers un autre URI, vous pouvez utiliser la
méthode Route::redirect. Cette méthode fournit un raccourci pratique pour que vous
n'ayez pas à définir une route ou un contrôleur complet pour effectuer une simple
redirection :
Route::redirect('/ici', '/là-bas');
Par défaut, Route::redirect renvoie un code d'état 302. Vous pouvez personnaliser le
code d'état à l'aide du troisième paramètre facultatif :
Route::redirect('/ici', '/là-bas', 301);
Ou, vous pouvez utiliser la méthode Route::permanentRedirect pour renvoyer un
code d'état 301:
Route::permanentRedirect ('/ici', '/là-bas ');
Gestion du routage
Afficher les routes
Si votre itinéraire ne doit renvoyer qu'une vue , vous pouvez utiliser la méthode
Route::view. Comme la méthode redirect, cette méthode fournit un raccourci simple
pour que vous n'ayez pas à définir une route ou un contrôleur complet. La méthode
view accepte un URI comme premier argument et un nom de vue comme second
argument. De plus, vous pouvez fournir un tableau de données à transmettre à la vue
en tant que troisième argument facultatif :
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Ahmed']);
Gestion du routage
La liste des routes
La commande Artisan route:list peut facilement fournir une vue d'ensemble de toutes
les routes définies par votre application :
php artisan route:list
Par défaut, le middleware de route affecté à chaque route ne sera pas affiché dans la
sortie route:list ; cependant, vous pouvez demander à Laravel d'afficher le
middleware de route en ajoutant l' option -v à la commande :
php artisan route:list -v
Vous pouvez également demander à Laravel de n'afficher que les routes commençant
par un URI donné :
php artisan route:list --path=api
Gestion du routage
De plus, vous pouvez demander à Laravel de masquer toutes les routes définies par
des packages tiers en fournissant l'option --except-vendor lors de l'exécution de la
commande route:list :
php artisan route:list --except-vendor
De même, vous pouvez également demander à Laravel de n'afficher que les routes
définies par des packages tiers en fournissant l'option --only-vendor lors de
l'exécution de la commande route:list :
php artisan route:list --only-vendor
Gestion du routage
Les routes nommées
Le nommage des routes est une fonctionnalité de Laravel qui permet d'attribuer un
nom à une route spécifique. Cela peut être très utile dans de nombreuses situations,
notamment lors de la création de liens ou de redirections dans votre application.
Par exemple, si vous avez une route qui affiche les détails d'un produit, vous pouvez
lui donner un nom comme suit :
Route::get('/product/{id}', function ($id) {
// Afficher les détails du produit avec l'ID $id
})->name('product.show');
Ici, la méthode name() est utilisée pour attribuer un nom à la route, qui est
'product.show'. Vous pouvez ensuite utiliser ce nom pour générer des URL dans votre
application.
Gestion du routage
Génération d'URL vers des routes nommées
Une fois que vous avez attribué un nom à une route donnée, vous pouvez utiliser le
nom de la route lors de la génération d'URL ou de redirections via les fonctions de
Laravel route et d'assistance redirect :
Si la route nommée définit des paramètres, vous pouvez passer les paramètres
comme deuxième argument à la fonction route. Les paramètres donnés seront
automatiquement insérés dans l'URL générée dans leurs positions correctes :
Route::get('/user/{id}/profile', function ($id) {//…})->name('profile');
route('profile', ['id' => 1]);
Gestion du routage
Si vous transmettez des paramètres supplémentaires dans le tableau, ces paires
clé/valeur seront automatiquement ajoutées à la chaîne de requête de l'URL générée :
Dans cet exemple, toutes les routes du groupe de routage auront un préfixe d'URL
'admin/', ce qui signifie que la route pour la page d'accueil de l'administration sera
accessible à l'URL 'admin/' et la route pour la liste des utilisateurs sera accessible à
l'URL 'admin/users'.
De plus, les groupes de routage permettent également d'appliquer des filtres de
routage à un ensemble de routes. Par exemple, vous pouvez utiliser un middleware
Gestion du routage
pour protéger l'accès aux routes du groupe d'administration, comme ceci :
Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function () {
// Routes protégées par le middleware d'authentification
});
Dans cet exemple, le middleware auth sera appliqué à toutes les routes du groupe
d'administration, ce qui signifie que seuls les utilisateurs authentifiés auront accès à
ces routes
Gestion du routage
En Laravel, une route peut avoir des paramètres qui permettent de capturer des
segments variables de l'URL. Par exemple, pour définir une route avec un paramètre
"id", vous pouvez utiliser le code suivant :
Route::get('/utilisateur/{id}', function ($id) {
return 'Utilisateur avec l\'identifiant : ' . $id;
});
D'un autre côté, lorsqu'une requête est envoyée à une route, elle peut inclure des
paramètres dans le corps de la requête ou dans l'en-tête de la requête. Ces paramètres
peuvent être récupérés dans la fonction associée à la route en utilisant l'objet Request.
Par exemple : use Illuminate\Http\Request;
Route::get('/connexion', function (Request $request) {
$identifiant = $request['identifiant'];
$mot_de_passe = $request['mot_de_passe'];
// Vérifier les identifiants et renvoyer une réponse });
Gestion du routage
Dans cet exemple, la route répondra aux requêtes HTTP GET envoyées à l'URL
/connexion. La fonction anonyme associée reçoit l'objet Request comme paramètre,
qui peut être utilisé pour récupérer les paramètres inclus dans le corps de la requête.
Dans cet exemple, les paramètres "identifiant" et "mot_de_passe" sont récupérés en
utilisant l'objet Request.
Manipulation des contrôleurs
Un contrôleur Laravel est une classe PHP qui gère la logique de traitement des
requêtes HTTP dans une application Laravel. Les contrôleurs sont souvent utilisés
pour organiser la logique de l'application en séparant la logique métier du code de
routage.
Les contrôleurs sont généralement stockés dans le répertoire app/Http/Controllers
de votre application Laravel. Vous pouvez créer un nouveau contrôleur en utilisant la
commande artisan make:controller. Par exemple, pour créer un contrôleur
UserController, vous pouvez utiliser la commande suivante :
php artisan make:controller UserController
Lorsqu'une requête est envoyée à votre application, Laravel utilise le routage pour
déterminer quelle méthode de contrôleur doit être exécutée. Le contrôleur est
responsable de récupérer les données nécessaires à partir des modèles de votre
Manipulation des contrôleurs
application, puis de les passer à la vue appropriée pour être affichées.
Voici un exemple de route qui appelle la méthode index() du contrôleur
UserController : Route::get('/users', 'UserController@index');
Dans cet exemple, la route est définie avec la méthode get() qui indique que la route
doit répondre à une requête GET. Le premier argument est l'URI de la route (dans cet
exemple, /users) et le deuxième argument est une chaîne de caractères qui spécifie le
nom du contrôleur (UserController) suivi d'un @ et du nom de la méthode à appeler
(index).
Lorsqu'un utilisateur accède à l'URI /users, Laravel va automatiquement appeler la
méthode index() du contrôleur UserController
Si votre contrôleur est dans un sous-namespace, vous pouvez spécifier le chemin
complet du contrôleur.
Manipulation des contrôleurs
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
// Récupérer la liste des utilisateurs depuis la base de données
$users = User::all();
// Afficher la vue index.blade.php et passer la liste des utilisateurs
return view('users.index', ['users' => $users]);
}
public function show($id)
{
// Récupérer l'utilisateur correspondant à l'ID depuis la base de données
$user = User::find($id);
// Afficher la vue show.blade.php et passer l'utilisateur
return view('users.show', ['user' => $user]);
}
}
Manipulation des contrôleurs
Dans cet exemple, nous avons un contrôleur UserController qui gère les actions liées
aux utilisateurs. Le contrôleur contient deux méthodes :
index() qui récupère la liste des utilisateurs à partir de la base de données et affiche la
vue users.index qui affiche la liste des utilisateurs.
show($id) qui récupère l'utilisateur correspondant à l'ID fourni dans l'URL à partir de
la base de données et affiche la vue users.show qui affiche les détails de l'utilisateur.
Manipulation des contrôleurs
Exercice :
1. Créer un contrôleur CalculeController, puis ajouter deux méthodes :
a. une méthode somme : qui a deux nombres en paramètres et qui calcule la
somme et retourne : la somme est …
b. une méthode produit : qui a deux nombres en paramètres et qui calcule le
produit et retourne : le produit est ...
2. Dans le fichier ‘web.php’ . ajouter deux routes . chacune vers une méthode du
contrôleur. Attention. les routes doivent avoir deux paramètres.
3. Tester le bon fonctionnement.
Manipulation des vues
Les vues sont un élément clé de la création d'applications web dans Laravel. Une vue
dans Laravel est simplement un fichier qui contient du HTML, des balises PHP et
éventuellement des éléments de contrôle de modèle tels que des boucles et des
conditions. Les vues sont utilisées pour afficher les données dynamiques à
l'utilisateur final.
Dans Laravel, les vues sont stockées dans le répertoire resources/views de votre
application. Les noms de fichier de vue sont généralement en minuscules avec des
tirets pour séparer les mots. Par exemple, si vous avez une vue pour afficher la liste
des utilisateurs, vous pouvez l'appeler users-list.blade.php.
Laravel utilise le moteur de templates Blade pour créer des vues. Blade est un moteur
de template simple et facile à utiliser qui permet l'ajout de conditions, boucles,
héritage, etc. dans les vues.
Manipulation des vues
Répertoires de vue imbriqués
Les vues peuvent également être imbriquées dans des sous-répertoires du répertoire
resources/views. La notation "Point" peut être utilisée pour référencer des vues
imbriquées.
Par exemple, si votre vue est stockée dans resources/views/admin/profile.blade.php,
vous pouvez la renvoyer depuis l'une des routes/contrôleurs de votre application
comme suit : return view('admin.profile', $data);
Manipulation des vues
Blade
Laravel possède un moteur de template élégant nommé Blade qui nous permet de
faire pas mal de choses. La première est de nous simplifier la syntaxe. Par exemple
au lieu de la ligne suivante :
<p>C'est l'article n° <?php echo $numero ?></p>
On peut utiliser cette syntaxe avec Blade :
<p>C'est l'article n° {{ $numero }}</p>
Tout ce qui se trouve entre les doubles accolades est interprété comme du code PHP.
Mais pour que ça fonctionne il faut indiquer à Laravel qu’on veut utiliser Blade pour
cette vue. Il suffit d’ajouter « blade » avant l’extension « php ».
Il y a aussi la version avec la syntaxe {!! … !!}. La différence entre les deux versions
est que le texte entre les doubles accolades est échappé ou purifié
Manipulation des vues
Affichage des données
Vous pouvez afficher les données transmises à vos vues Blade en enveloppant la
variable entre accolades.
Hello, {{ $name }}.
Vous n'êtes pas limité à l'affichage du contenu des variables passées à la vue. Vous
pouvez également afficher les résultats de n'importe quelle fonction PHP. En fait,
vous pouvez mettre n'importe quel code PHP que vous souhaitez echo dans une
instruction Blade : The current UNIX timestamp is {{ time() }}.
Les Directives
Outre l'héritage des modèles et l'affichage des données, Blade fournit également des
raccourcis pratiques pour les structures de contrôle PHP courantes, telles que les
Manipulation des vues
instructions conditionnelles et les boucles. Ces raccourcis offrent une manière très
propre et concise de travailler avec les structures de contrôle PHP tout en restant
familiers à leurs homologues PHP.
Vous pouvez construire des instructions if à l'aide des directives @if, @elseif, @else
et @endif. Ces directives fonctionnent de la même manière que leurs homologues
PHP :
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
Manipulation des vues
En plus des directives conditionnelles déjà discutées, les directives @isset @empty
peuvent être utilisées comme raccourcis pratiques pour leurs fonctions PHP
respectives : @isset($records)
// $records is defined and is not null...
@endisset
@empty($records)
// $records is "empty"...
@endempty
Les instructions switch peuvent être construites à l'aide
des directives @switch, @case, @break et @default @endswitch
@switch($i)
@case(1)
First case...
@break
@default
Default case...
@endswitch
Manipulation des vues
En plus des instructions conditionnelles, Blade fournit des directives simples pour
travailler avec les structures de boucle de PHP. Encore une fois, chacune de ces
directives fonctionne de manière identique à leurs homologues PHP :
@while (true)
<p>I'm looping forever.</p>
@endwhile
Manipulation des vues
Lorsque vous utilisez des boucles, vous pouvez également ignorer l'itération en cours
ou terminer la boucle à l'aide des directives @continue et @break :
@if ($user->number == 5)
@break
@endif
@endforeach
Manipulation des vues
Transmission des données aux vues
Vous pouvez passer un tableau de données aux vues pour rendre ces données
disponibles à la vue :
// in a Laravel controller
return view('greeting', ['name' => 'Alex']);
// in routes/greeting.php
Route::get('/greeting', function () { return view('greeting', ['name' => 'Alex']); });
Maintenant, supposons que vous ayez une page "contact" sur votre site web que vous
souhaitez afficher à l'aide de cette structure de base. Vous pouvez créer une vue
enfant appelée "contact.blade.php" et hériter de la vue parente en utilisant la directive
@extends :
contact.blade.php :
Manipulation des vues
@extends('layout')
@section('content')
<h2>Contactez-nous</h2>
<p>Remplissez le formulaire ci-dessous pour nous contacter :</p>
<form action="/contact" method="post">
<!-- ... -->
</form>
@endsection
Dans cette vue, la directive @extends('layout') indique que la vue parente à utiliser
est "layout.blade.php". La directive @section('content') remplit la section principale
de la vue parente avec du contenu spécifique à la page de contact.
Ainsi, lorsque vous affichez la page "contact" sur votre site web, Laravel combinera
automatiquement le contenu de la vue parente et de la vue enfant pour produire la
page finale avec la structure de base et le contenu spécifique à la page de contact.
Manipulation des vues
Les vues partielles
@include est utilisé pour inclure une vue dans une autre vue. Il est utile lorsque vous
avez besoin d'afficher le contenu d'une vue dans plusieurs autres vues. Vous pouvez
inclure une vue en utilisant la syntaxe suivante :
<!DOCTYPE html>
<html>
<head>
<title>Mon site web</title>
</head>
<body>
@include('header')
<div class="content">
<h1>Bienvenue sur mon site web</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</body>
</html>
Manipulation des vues
Dans cet exemple, la vue header est incluse en utilisant la directive
@include('header'). La vue header doit être stockée dans le dossier resources/views et
avoir l'extension .blade.php.
Pour passer des paramètres à une vue partielle incluse avec la directive @include
dans Laravel, vous pouvez utiliser la syntaxe suivante :
@include('header', ['title' => 'Page d\'accueil'])
Dans la vue incluse, vous pouvez accéder aux paramètres passés en utilisant la
variable correspondante. Par exemple, si vous passez un paramètre nommé titre à la
vue incluse, vous pouvez l'afficher en utilisant la syntaxe suivante :
<h1>{{ $titre }}</h1>
Manipulation des vues
Exercice :
1. Créer une page nommée layout.blade.php qui contient une structure générale de
vos page.
2. Ensuite, créer deux page nommée page1.blade.php et page2.blade.php qui héritent
depuis la page layout en ajoutant un contenu spécifique à chaque page.
Utilisation des Middleware
Utilisation des Middleware
Le middleware fournit un mécanisme pratique pour inspecter et filtrer les requêtes
HTTP entrant dans votre application. Par exemple, Laravel inclut un middleware qui
vérifie que l'utilisateur de votre application est authentifié. Si l’ utilisateur n'est pas
authentifié, le middleware redirigera l'utilisateur vers l'écran de connexion de votre
application. Cependant, si l'utilisateur est authentifié, le middleware permettra à la
demande de continuer plus loin dans l'application.
Utilisation des Middleware
Créer middleware
La façon la plus simple de créer un middleware est d'utiliser Artisan. Appeler la
commande make:middleware a pour effet de créer une structure de base de
middleware dans le dossier réservé a cet usage: app/Http/Middleware
php artisan make:middleware NomMiddleware
Cette commande placera une nouvelle classe NomMiddleware dans le répertoire
app/Http/Middleware.
Le middleware c'est une classe qui contient deux méthodes handle et terminate. Sauf
que terminate n'est pas généré automatiquement il faut l’ajouter manuellement.
public function handle(Request Srequest, Closure Snext){}
public function terminate(Request $request, Response $response{}
Utilisation des Middleware
Enregistrement d'un middleware
Après la création du middleware, nous devons informer l'application que le
middleware existe. Si vous souhaitez qu'un middleware s'exécute à chaque demande,
accédez à app/Http/kernel.php et ajouter le middleware au Kernel.
Types Middleware
Utilisation des Middleware
Pour utiliser le middleware dans Laravel, vous devez le définir soit dans le tableau
$routeMiddleware ou $middlewareGroups ou $middleware dans le fichier
app/Http/Kernel.php. Ensuite, vous pouvez appliquer le middleware aux routes
individuelles ou aux groupes de routes à l'aide de la méthode middleware dans votre
fichier de routes.
Voici un exemple d'application du middleware à une route dans Laravel:
Route::get('/dashboard', function () {//… })->middleware('auth');
Dans cet exemple, le middleware auth est appliqué à la route /dashboard. Cela
signifie que la requête sera d'abord filtrée par le middleware auth avant d'être
transmise à la fonction de fermeture pour être traitée.
Utilisation des Middleware
class CheckAge
{
public function handle(Request $request, Closure $next)
{
$age = 15;
if ($age < 18) {
return redirect('/')->with('error', 'Vous devez être majeur pour accéder.');
//ou abort(404)
}
return $next($request);
}}
Lier un middleware à un controller
Un middleware peut être affecté aux routes du contrôleur dans vos fichiers de routes :
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
Ou, vous trouverez peut-être pratique de spécifier un middleware dans le
constructeur de votre contrôleur. En utilisant la méthode middleware dans le
constructeur de votre contrôleur, vous pouvez affecter un middleware aux actions du
contrôleur : class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
Lier un middleware à un controller
$this->middleware('auth') : cela applique le middleware auth à toutes les méthodes
de ce contrôleur. Le middleware auth est responsable de vérifier si l'utilisateur est
authentifié avant de lui permettre d'accéder à une ressource.
$this->middleware('log')->only('index') : cela applique le middleware log
uniquement à la méthode index de ce contrôleur. Le middleware log est responsable
de journaliser les demandes entrantes.
$this->middleware('subscribed')->except('store') : cela applique le middleware
subscribed à toutes les méthodes de ce contrôleur, sauf à la méthode store. Le
middleware subscribed vérifie si l'utilisateur est abonné avant de lui permettre
d'accéder à une ressource.
contrôleur de ressources
Dans Laravel, un contrôleur de ressources (ou resource controller en anglais) est un
contrôleur qui implémente des méthodes pré-définies pour gérer les différentes
actions CRUD (Create, Read, Update, Delete) d'une ressource.
Pour créer un contrôleur de ressources, vous pouvez utiliser la commande
make:controller de Laravel avec l'option --resource :
php artisan make:controller MyResourceController --resource
Route::resource('photos', PhotoController::class);
contrôleur de ressources
contrôleur de ressources
GET /photos : appelle la méthode index() du contrôleur
GET /photos/create : appelle la méthode create() du contrôleur pour afficher un formulaire de
création
POST /photos : appelle la méthode store(Request $request) du contrôleur pour enregistrer une
nouvelle ressource
GET /photos/{photo} : appelle la méthode show($id) du contrôleur pour afficher une ressource
spécifique
GET /photos/{photo}/edit : appelle la méthode edit($id) du contrôleur pour afficher un
formulaire d'édition
PUT/PATCH /photos/{photo} : appelle la méthode update(Request $request, $id) du contrôleur
pour mettre à jour une ressource existante
DELETE /photos/{photo} : appelle la méthode destroy($id) du contrôleur pour supprimer une
ressource existante
Protection CSRF(Cross-Site Request
Forgery)
Falsification de requêtes intersites
Les falsifications de requêtes inter-sites sont un type d'exploit malveillant par lequel
des commandes non autorisées sont exécutées au nom d'un utilisateur authentifié.
L’impact de cette attaque dépend des privilèges de la victime sur le système.
Laravel fournit une protection contre les attaques CSRF en générant un jeton CSRF.
Ce jeton CSRF est généré automatiquement pour chaque utilisateur. Ce jeton n'est
rien d'autre qu'une chaîne aléatoire gérée par l'application Laravel pour vérifier les
demandes des utilisateurs.
Cette protection de jeton CSRF peut être appliquée à n'importe quel formulaire
HTML dans l’application Laravel en spécifiant un champ de formulaire caché du
jeton CSRF,
Protection CSRF(Cross-Site Request
Forgery)
Une des manières efficaces de se prémunir contre les attaques CSRF est
d'accompagner chaque formulaire a protéger d'un jeton (en anglais "token")
d'identification de session. Pour ce faire:
lorsqu'un visiteur se connecte sur votre site, vous enregistrez en session une chaine
de caractère aléatoire.
Cette même chaine est récupérée en session et passée au formulaire, sous la forme
d'un champ de type "hidden",
Lorsque le formulaire est posté, votre système de validation doit vérifier que le
champ caché contient la même valeur que celle enregistrée en session.
Si ce n'est pas le cas, ça signifie que quelqu'un a essayé de soumettre le formulaire
depuis un autre endroit que votre site. Il faut alors annuler le traitement de ce
formulaire.
Protection CSRF(Cross-Site Request
Forgery)
Laravel inclut un plug-in CSRF intégré, qui génère des jetons pour chaque
session utilisateur active. Ces jetons vérifient que les opérations ou requêtes sont
envoyées par l’utilisateur authentifié concerné.
Empêcher les requêtes CSRF
CSRF est implémenté dans les formulaires HTML déclarés dans les applications
Web. Vous devez inclure un jeton CSRF validé masqué dans le formulaire, afin que
le middleware de protection CSRF de Laravel puisse valider la demande.
La protection CSRF peut être implémentée dans Laravel à l’aide de n'importe quel
formulaire HTMIL avec une forme cachée de jeton CSRF et la demande de
l’utilisateur est validée à l’aide du middleware CSRF VerifyCsrfToken.
Protection CSRF(Cross-Site Request
Forgery)
L'une des options suivantes peut être utilisée pour générer un jeton CSRF
1. Empêcher les requêtes CSRF via @csrf
@csrf est une directive de Blade pour générer un champ de jeton qui sera utilisé pour
la vérification. Il génère un champ de saisie masqué.
Lorsque la directive blade @csrf est utilisée, une balise input de type="hidden est
ajoutée au formulaire. La valeur sera le jeton CSRF qui sera envoyé dans le cadre des
données du formulaire lorsque le formulaire est soumis.
Syntaxe
<form action="{{ url/..)}" method="post">
@csrf
…
</form>
Protection CSRF(Cross-Site Request
Forgery)
Exercice:
Créer une vue qui contient un formulaire comme suit:
…
// Rediriger l'utilisateur vers une autre page
return redirect('/')->with('success', 'Votre compte a été créé avec succès !');
}
}
Validation des formulaires
Dans cet exemple, la méthode validate() est appelée avec un tableau de règles de
validation. Si les données ne respectent pas les règles de validation, Laravel génère
automatiquement une exception Illuminate\Validation\ValidationException. Dans ce
cas, il est possible d'accéder aux erreurs de validation en utilisant la méthode
getMessage() de l'exception.
Les messages d'erreur sont en anglais. On peut cependant personnaliser les messages
en modifiant le fichier \lang\validation.php
Notez que la méthode validate() peut également prendre en charge des messages
d'erreur personnalisés en passant un tableau de messages à la méthode validate().
Cela permet de personnaliser les messages d'erreur pour chaque règle de validation.
Validation des formulaires
$validatedData = $request->validate([
'username' => 'required|max:50',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8',
], [
'username.required' => 'Le champ nom d\'utilisateur est obligatoire.',
'username.max' => 'Le champ nom d\'utilisateur ne doit pas dépasser :max
caractères.',
'email.required' => 'Le champ adresse email est obligatoire.',
'email.email' => 'Le champ adresse email doit être une adresse email
valide.',
'email.unique' => 'L\'adresse email est déjà utilisée par un autre
utilisateur.',
'password.required' => 'Le champ mot de passe est obligatoire.',
'password.min' => 'Le champ mot de passe doit avoir au moins :min
caractères.',
]);
Validation des formulaires
Une fois que la validation a échoué, Laravel renvoie automatiquement l'utilisateur à
la page précédente avec les erreurs de validation. Les erreurs sont stockées dans la
variable $errors, qui peut être affichée dans la vue pour informer l'utilisateur des
erreurs qu'il doit corriger.
Voici un exemple de code pour afficher les erreurs de validation dans la vue :
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
Validation des formulaires
Laravel offre également une directive Blade @error qui permet d'afficher les erreurs
de validation directement à côté de chaque champ de formulaire sans avoir à utiliser
une condition @if pour chaque champ.
Voici un exemple de code pour afficher les erreurs de validation à côté de chaque
champ de formulaire en utilisant la directive Blade @error :
<form method="POST" action="/users">
<div class="form-group">
<label for="username">Nom d'utilisateur :</label>
<input type="text" id="username" name="username" class="form-control
@error('username')
<span class="invalid-feedback" role="alert">{{ $message }}</span>
@enderror
</div>
<button type="submit" class="btn btn-primary">Créer un compte</button>
</form>
utiliser une base de données MySQL
Pour utiliser une base de données MySQL en Laravel 9 et créer des requêtes SQL
CRUD, vous devez tout d'abord configurer votre application pour qu'elle se connecte
à votre base de données. Voici les étapes à suivre:
Créez une nouvelle base de données MySQL en utilisant l'outil de votre choix.
Ouvrez le fichier .env à la racine de votre projet Laravel et configurez les paramètres
de base de données comme suit:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nom_de_votre_base_de_donnees
DB_USERNAME=votre_nom_d_utilisateur
DB_PASSWORD=votre_mot_de_passe
Utilisez la méthode DB::insert() pour insérer des données dans une table. Par
exemple, pour insérer un nouvel enregistrement:
DB::insert('INSERT INTO table_name (column1, column2) VALUES (?, ?)',
['value1', 'value2']);
utiliser une base de données MySQL
Utilisez la méthode DB::update() pour mettre à jour des données dans une table. Par
exemple, pour mettre à jour un enregistrement existant:
DB::update('UPDATE table_name SET column1 = ?, column2 = ? WHERE id = ?',
['new_value1', 'new_value2', $id]);
Utilisez la méthode DB::delete() pour supprimer des données d'une table. Par
exemple, pour supprimer un enregistrement:
Bien que l'utilisation de requêtes SQL directement dans Laravel puisse être utile dans
certaines situations, il est généralement recommandé d'utiliser les outils de haut
niveau fournis par Laravel, tels que le Query Builder ou les modèles Eloquent, pour
une meilleure maintenabilité et une meilleure sécurité de l'application.
Manipulation des requêtes HTTP pour
les fichiers
La manipulation des requêtes HTTP pour les fichiers dans une application Laravel
peut être effectuée via l'utilisation de la classe Illuminate\Http\Request. Cette classe
fournit des méthodes pour récupérer et manipuler les fichiers envoyés dans une
requête HTTP.
Voici un exemple de code pour la manipulation d'un fichier image envoyé via une
requête HTTP en utilisant la classe Illuminate\Http\Request :
Cette méthode commence une transaction, exécute le code dans la fonction anonyme
et valide la transaction automatiquement si tout se passe bien, ou annule la
transaction si une exception est levée.
Vous pouvez utiliser d’autre méthode, voici un exemple de code pour effectuer une
transaction en Laravel :
Les transactions
DB::beginTransaction();
try {
// exécutez ici vos requêtes SQL qui modifient les données
dans la base de données
DB::commit();
} catch (\Exception $e) {
DB::rollback();
}
1. Sélection de données :
Vous pouvez sélectionner des données d'une table en utilisant la méthode select. Par
exemple, pour sélectionner tous les enregistrements de la table "users" :
$users = DB::table('users')->select('*')->get();
Query Builder /générateur de requêtes
Vous pouvez également sélectionner des colonnes spécifiques en les passant en
argument à la méthode select :
$users = DB::table('users')->select('name', 'email')->get();
La méthode raw en Laravel permet d'insérer une expression SQL brute dans une
requête. Cela peut être utile pour des situations où le générateur de requêtes de
Laravel ne permet pas de construire la requête souhaitée ou si vous avez besoin
d'utiliser des expressions SQL plus avancées.
Voici un exemple d'utilisation de la méthode raw pour insérer une expression SQL
brute dans une requête de sélection de données :
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->groupBy('status')
->get();
Query Builder /générateur de requêtes
2. Recherche de données :
Vous pouvez utiliser la méthode where pour filtrer les données en fonction d'une
condition. Par exemple, pour sélectionner tous les enregistrements de la table "users"
où le nom est "John" :
$users = DB::table('users')->where('name', 'John')->get();
$orders = DB::table('orders')
->where('total_amount', '>', 1000)
->where('order_date', '<', '2022-01-01')
->get();
$users = DB::table('users')
->where('name', 'John')
->orWhere('email', '[email protected]')
->get();
Query Builder /générateur de requêtes
Il est tout à fait possible de combiner des conditions de filtrage avec des opérateurs
logiques "ET" et "OU" dans une même requête de sélection de données en utilisant
les méthodes where, orWhere de Laravel.
Par exemple, si nous voulons récupérer tous les enregistrements de la table "users"
dont le nom est "John" et dont l'adresse e-mail est "[email protected]" ou
"[email protected]", nous pouvons utiliser les méthodes where, whereRaw,
orWhere et orWhereRaw comme suit :
$users = DB::table('users')
->where('name', 'John')
->where(function($query) {
$query->where('email', '[email protected]')
->orWhere('email', '[email protected]');
})
->get();
Query Builder /générateur de requêtes
La méthode whereBetween de Laravel permet de spécifier une condition de filtrage
pour récupérer les enregistrements d'une table dont une colonne se situe dans un
certain intervalle de valeurs.
Par exemple, si nous voulons récupérer tous les enregistrements de la table "orders"
dont la date se situe entre le 1er janvier 2022 et le 31 décembre 2022, nous pouvons
utiliser la méthode whereBetween comme suit :
$orders = DB::table('orders')
->whereBetween('date', ['2022-01-01', '2022-12-31'])
->get();
$totalUsers = DB::table('users')->count();
Query Builder /générateur de requêtes
5. Trier les données :
Vous pouvez trier les données en utilisant la méthode orderBy. Par exemple, pour
trier la table "users" par la colonne "name" dans l'ordre croissant :
$users = DB::table('users')->orderBy('name', 'asc')->get();
6. Regroupement
Les méthodes groupBy et having de Laravel permettent de regrouper les
enregistrements d'une table en fonction de certaines colonnes et de filtrer les résultats
regroupés en utilisant des conditions de filtrage sur des colonnes agrégées.
$ordersByCustomer = DB::table('orders')
->select('customer_id', DB::raw('count(*) as total_orders'))
->groupBy('customer_id')
->having('total_orders', '>', 10)
->get();
Query Builder /générateur de requêtes
7. Limiter le nombre de lignes retourné :
La méthode limit de Laravel est utilisée pour limiter le nombre d'enregistrements
renvoyés par une requête de sélection. Elle prend en paramètre le nombre maximum
d'enregistrements à renvoyer.
$orders = DB::table('orders')
->limit(1)
->get();
8. Insérer des données :
Vous pouvez insérer des données dans une table en utilisant la méthode insert. Par
exemple, pour insérer un nouvel utilisateur :
DB::table('users')->insert([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => 'password123'
]);
Query Builder /générateur de requêtes
9. Mettre à jour des données :
Vous pouvez mettre à jour des données dans une table en utilisant la méthode update.
Par exemple, pour mettre à jour le nom de l'utilisateur dont l'ID est 1 :
DB::table('users')
->where('id', 1)
->update(['name' => 'Jane Doe']);
La méthode primary() peut être utilisée pour définir une clé primaire sur une colonne
ou un ensemble de colonnes.
$table->string(code')->primary();
Migration
Mettre à jour une table:
Lorsque vous voulez mettre à jour une table dans Laravel, vous pouvez nommer
votre migration avec un nom descriptif de votre migration.
Par exemple, si vous souhaitez ajouter une colonne age à votre table users, vous
pouvez nommer votre migration : add_age_to_users_table
Voici comment créer une migration pour ajouter une colonne age à votre table users :
php artisan make:migration add_age_to_users_table --table=users
Ensuite, dans la méthode up() de votre migration, vous pouvez ajouter la colonne
age: public function up(){
Schema::table('users', function (Blueprint $table) {
$table->integer('age');
});
}
Migration
Voici un exemple pour ajouter une colonne phone_number à la table users existante :
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone_number');
});
}
$table->foreign('user_id')->references('id')->on('users');
});
Vous pouvez également utiliser la méthode foreignId en combinaison avec
constrained() pour ajouter une clé étrangère dans Laravel. La méthode foreignId crée
une colonne de type unsignedBigInteger avec un nom qui suit la convention
nom_de_la_table_id. La méthode constrained permet de définir les détails de la
Migration
contrainte de clé étrangère.
Voici un exemple de code qui ajoute une clé étrangère user_id à la table posts en
référençant la colonne id de la table users :
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});
Dans cet exemple, la méthode foreignId crée automatiquement une colonne user_id
de type unsignedBigInteger. La méthode constrained prend en argument le nom de
la table cible pour la clé étrangère (dans ce cas, users). La méthode constrained utilise
les conventions de Laravel pour définir les noms des colonnes référencées et la
suppression en cascade, mais vous pouvez également spécifier ces détails
manuellement si nécessaire.
Migration
Par exemple :
$table->foreignId('user_id')
->constrained()
->onUpdate('cascade|restrict|null')
->onDelete('cascade|restrict|null');
Dans ce code, la méthode factory est appelée sur le modèle User, et la méthode count
est utilisée pour spécifier le nombre d'utilisateurs à générer. La méthode create est
ensuite appelée pour enregistrer les données générées dans la base de données.
ORM Eloquent
Introduction
L'application Web Laravel pourrait communiquer directement avec les tables de la
base de données. Cependant, il sera plus intéressant d’utiliser des modèles, c'est-à-
dire une représentation objet de chacune des tables
Lorsqu'on utilise une telle couche, placée entre le controlleur et la base de données,
on dira qu'on fait du mapping objet-relationnel, souvent référé comme ORM (object-
relational mapping). LORM livré avec Laravel s'appelle Eloquent.
Génération du modèle
Nous avons vu que Laravel utilise une architecture en MVC (Model View Controller)
Dans cette architecture l’intermédiaire entre le Contrôleur et la base de données est le
Model.
ORM Eloquent
ORM Eloquent
Une fois la base de données est modélisée, On doit créer des modèles pour nos tables.
Chaque table dans la BD doit correspondre à un Model qui sera utilisé pour
interagir avec la table. Le fichier dans lequel le modèle est défini sera généré à laide
de la commande
php artisan make:model Nom_Model
N.B :Pour suivre les standards de Laravel, le nom du modèle doit débuter par une
majuscule et être au singulier.
Exemple :
php artisan make:model Stagiaire
Clé primaire : Eloquent suppose également que chaque table possède une colonne de
clé primaire appelée id. Vous pouvez définir une propriété $primaryKey pour
remplacer cette convention: protected $primaryKey = "code" ;
Eloquent suppose que la clé primaire est une valeur entière incrémentée, ce qui
signifie que, par défaut, la clé primaire sera automatiquement convertie en int.
ORM Eloquent
Si vous souhaitez utiliser une clé primaire non incrémentée ou non numérique, vous
devez définir les propriétés publique $incrementing et $keyType sur votre modèle
comme suit :
public $incrementing = false;
protected $keyType= 'string;
Timestamps
Si vous ne souhaitez pas que les colonnes created_ at et updated_at soient gérées
automatiquement par Eloquent, définissez la propriété $timestamps sur votre modèle
sur false: public $timestamps = false;
ORM Eloquent
Opérations CRUD
Lorsqu'un modèle est créé et associé à une table de base de données, vous êtes prêt à
commencer à récupérer les données de la base de données. Chaque modèle Eloquent
peut être considéré comme un puissant générateur de requêtes qui vous permet
d'interroger de manière fluide la table de base de données associé au modèle.
Pour commencer, on génère une migration et un contrôleur de type ressource avec le
modèle : php artisan make:model Stagiaire -cr
Création de la route : on utilise une route resource
Route::resource('stagiaires', 'StagiaireController::class');
Cette déclaration de route unique crée plusieurs routes pour gérer diverses actions
sur la ressource( comme déjà vu dans la partie du cours contrôleur de ressource)
ORM Eloquent
Read (Lire) : Pour lire un ou plusieurs modèles à partir de la base de données, vous
pouvez utiliser la méthode all() pour récupérer tous les modèles ou la méthode find()
pour récupérer un modèle spécifique en fonction de son identifiant.
La méthode "index" récupère tous les utilisateurs de la base de données à l'aide de la
méthode "all" de l'ORM Eloquent et les stocke dans une variable appelée "users".
Elle renvoie ensuite la vue "users.index" avec les données "users".
// Mise à jour les informations d'un utilisateur spécifique dans la base de données.
public function update(Request $request, $id)
{
$user = User::find($id);
$user->name = $request->name;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->save();
return redirect()->route('users.index');
}
ORM Eloquent
Delete (Supprimer) : Pour supprimer un modèle existant de la base de données,
vous pouvez le récupérer en utilisant la méthode find() ou first(), puis appeler la
méthode delete() pour le supprimer de la base de données.
La méthode "destroy" supprime un utilisateur spécifique de la base de données. Elle
récupère l'utilisateur à partir de la base de données en utilisant la méthode statique
"find" de l'ORM Eloquent, puis appelle la méthode "delete" sur l'instance du modèle
pour supprimer l'enregistrement correspondant de la base de données. Enfin, elle
redirige l'utilisateur vers la méthode "index" du contrôleur.
ORM Eloquent
/**
* Supprime un utilisateur spécifique de la base de données.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$user = User::find($id);
$user->delete();
return redirect()->route('users.index');
}
les relations de modèle dans Laravel
Eloquent
Définition
Une relation signifie que vous avez deux tables ou plus avec des enregistrements qui
sont liés les uns aux autres .
Les relations Eloquent sont définies comme des méthodes sur vos classes de modèle
Eloquent.
Étant donné que les relations servent également de puissants générateurs de requêtes ,
la définition de relations en tant que méthodes offre de puissantes capacités de
chaînage de méthodes et d'interrogation.
les relations de modèle dans Laravel
Eloquent
Relation (One To One)
La plus simple relation mais la moins utile. Une relation de type « Has One » ou «
One-To-One ». Cela signifie effectivement qu’un certain enregistrement est lié à un
autre enregistrement (mais pas à plusieurs autres enregistrements !).
les relations de modèle dans Laravel
Eloquent
Relation (One To One)
la relation directe : hasOne
personnes adresses
Id Id
nom hasOne rue
prenom numero
ville
Personne_id
l’inverse de la relation : belongsTo
personnes adresses
Id
Id rue
nom belongsTo numero
prenom ville
Personne_id
les relations de modèle dans Laravel
Eloquent
Relation (One To One)
Pour établir une relation "one to one" en Eloquent, vous devez définir la méthode
hasOne dans le modèle parent et la méthode belongsTo dans le modèle enfant.
Dans le modèle Personne:
class Personne extends Model{
public function adresse()
{
return $this->hasOne('App\Models\Adresse', ‘peronne_id');
}
}
return redirect()->route('personnes.index');
}
les relations de modèle dans Laravel
Eloquent
Update (Modifier) :
return redirect()->route('personnes.index');
}
les relations de modèle dans Laravel
Eloquent
Destroy (Supprimer) :
return redirect()->route('personnes.index');
}
les relations de modèle dans Laravel
Eloquent
Relation (One To Many)
Une relation "one to many" (un-à-plusieurs) existe entre la table "filiere" et la table
"stagiaire", une filière peut avoir plusieurs stagiaires, mais chaque stagiaire ne peut
appartenir qu'à une seule filière.
Dans ce cas, la table "filiere" agirait comme l'entité parente, tandis que la table
"stagiaire" serait l'entité enfant. La clé primaire de la table "filiere" serait utilisée
comme clé étrangère dans la table "stagiaire" pour établir la relation.
Par exemple, la table "filiere" pourrait contenir les informations suivantes :
les relations de modèle dans Laravel
Eloquent
Et la table "stagiaire" pourrait ressembler à ceci :
Dans cet exemple, les stagiaires Alice et Bob appartiennent à la filière Informatique
(id_filiere = 1), tandis que Claire appartient à la filière Marketing (id_filiere = 2). La
colonne "id_filiere" dans la table "stagiaire" est une clé étrangère qui fait référence à
la clé primaire "id_filiere" de la table "filiere".
les relations de modèle dans Laravel
Eloquent
Relation (One To Many)
la relation directe : hasOne
filieres stagaiares
Id
Id nom
Nom_filiere hasMany
prenom
filiere_id
Cela renverra une collection de tous les stagiaires de la filière avec l'id 1.
De même, pour récupérer la filière à laquelle appartient un stagiaire spécifique, vous
pouvez utiliser la méthode "filiere" sur l'objet "Stagiaire" :
$stagiaire = Stagiaire::find(1);
$filiere = $stagiaire->filiere;
les relations de modèle dans Laravel
Eloquent
Read (Lire) :
Dans le code ci-dessus, la méthode "index()" récupère toutes les stagiaires et les
passe à une vue pour les afficher.
return redirect()->route('stagiaires.index');
}
les relations de modèle dans Laravel
Eloquent
Relation (ManyTo Many)
La relation Many-To-Many en Laravel avec Eloquent ORM permet de relier deux
tables entre elles de manière à ce qu'un enregistrement d'une table puisse être associé
à plusieurs enregistrements d'une autre table, et vice versa.
supposons que les tables stagiaires et modules sont lié avec une relation many to
many et qui génère une troisième table notes qui contient la note d'un stagiaire pour
un module donné.
Ces tables sont liées par une relation Many-to-Many, où chaque "Stagiaire" peut
avoir plusieurs "Modules", et chaque "Module" peut être associé à plusieurs
"Stagiaires". La table pivot "notes" contient les notes des stagiaires pour chaque
module
Voici un exemple de données pour les trois tables que nous avons définies
ORM Eloquent
La table "stagiaires" :
La table "modules" :
La table "notes" :
ORM Eloquent
Remarque : Il faut donc au préalable créer également une migration pour la table
d’association. le nom de la table est construit en joignant les noms des tables (tous
deux au singulier) dans L'ordre alphabétique. Cela permet à Laravel de faire
directement le lien entre les tables sans avoir à préciser le nom de la table de relation.
Si le nom de la table de relation many-to-many entre les deux tables ne correspond
pas à la convention de nommage de Laravel, vous pouvez le spécifier en utilisant le
deuxième argument de la méthode belongsToMany().
Par défaut, Eloquent va chercher une table de liaison qui combine les noms de
modèle en ordre alphabétique et en utilisant le singulier de chaque nom. Par exemple,
si nous avons un modèle User et un modèle Role, Eloquent va chercher une table de
liaison nommée role_user.
ORM Eloquent
Si le nom de votre table de liaison ne suit pas cette convention de nommage, vous
pouvez spécifier le nom de la table de liaison en utilisant le deuxième argument de la
méthode belongsToMany(). Par exemple, si la table de liaison est nommée
user_roles, vous pouvez le spécifier comme suit :
Le premier argument est le nom de la classe de modèle à laquelle vous voulez vous
connecter (Role::class).
Le deuxième argument est le nom de la table de relation (user_role).
Le troisième argument est le nom de la clé étrangère de la table de relation qui fait
référence à la table de modèle actuelle (user_id pour le modèle "User").
Le quatrième argument est le nom de la clé étrangère de la table de relation qui fait
référence à la table de modèle cible (role_id pour le modèle "Role").
ORM Eloquent
Dans cette migration, vous pouvez ajouter les colonnes que vous souhaitez dans la
table "modules", par exemple :
Schema::create('modules', function (Blueprint $table) {
$table->id();
$table->string('nom');
$table->text('description');
$table->timestamps();
});
Dans cette migration, vous pouvez ajouter les colonnes que vous souhaitez dans la
table "stagiaires", par exemple :
Schema::create('stagiaires', function (Blueprint $table) {
$table->id();
$table->string('nom');
$table->string('prenom');
$table->timestamps();
});
ORM Eloquent
Dans cette migration, vous pouvez ajouter les colonnes que vous souhaitez dans la
table "notes", par exemple :
$table->foreign('module_id')->references('id')->on('modules');
$table->foreign('stagiaire_id')->references('id')->on('stagiaires');
});
les relations de modèle dans Laravel
Eloquent
Créez les modèles "Module", "Stagiaire":
class Module extends Model
{
public function stagiaires()
{
return $this->belongsToMany(Stagiaire::class, 'notes')->withPivot('note');
}
}
$module = Module::find(1);
$stagiaires = $module->stagiaires;
C’est avec cette commande que vont être créés les routes, vues, controlleurs…Là on
nous pose une question :
Authentification de laravel
On va choisir la première option blade. Répondez aussi non aux deux questions
suivantes.
Regardez ce qui a été ajouté dans le fichier routes/web.php :
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
require __DIR__.'/auth.php';
Authentification de laravel
Les vues de l’authentification
Il y a également eu la génération de nombreuses vues :
Authentification de laravel
La création de l’utilisateur
La création de l’utilisateur se fait aussi dans le contrôleur :
public function store(Request $request): RedirectResponse
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
}
Une fois que l’utilisateur est créé dans la base il est automatiquement connecté et est
redirigé sur le dashboard :
Authentification de laravel
La connexion d’un utilisateur
Pour se connecter, il faut utiliser l’url …/login.
Si vous venez juste d’enregistrer un utilisateur il faudra le déconnecter avant d’avoir
accès au formulaire de login.
On voit qu’on utilise le contrôleur AuthenticatedSessionController avec sa
méthode create qui se contente de renvoyer une vue :
public function create(): View
{
return view('auth.login');
}
Authentification de laravel
La déconnexion d’un utilisateur
L’utilisateur dispose d’un lien pour se déconnecter :
$user->notify(new RegisteredNotification());
...
}
Notification
Maintenant quand un utilisateur s’enregistre il reçoit un email :
Notification
Le renouvellement du mot de passe
Laravel, après la demande de renouvellement du mot de passe de l’utilisateur,
expédie ce genre d’email :
event(new StagiaireCreated($stagiaire));
return redirect()->route('stagiaires.index');
}
}
Les événements
Le contrôleur StagiaireController contient une méthode store qui crée un nouveau
stagiaire en utilisant la méthode create du modèle Stagiaire et déclenche un
événement StagiaireCreated en passant le stagiaire nouvellement créé comme
argument. Enfin, il redirige l'utilisateur vers la liste des stagiaires.
Créer un événement StagiaireCreated dans une classe StagiaireCreated dans le fichier
app/Events/StagiaireCreated.php : php artisan make:event StagiaireCreated
class StagiaireCreated{
use Dispatchable, SerializesModels;
public $stagiaire;
class SendStagiaireCreatedNotification
{
public function handle(StagiaireCreated $event)
{
$event->stagiaire->notify(new StagiaireCreatedNotification($event->stagiaire));
}
}
Créer une notification StagiaireCreatedNotification pour notifier l'administrateur de
l'ajout d'un nouveau stagiaire dans le fichier
app/Notifications/StagiaireCreatedNotification.php : comme déjà vu précédemment.
Les événements
class StagiaireCreatedNotification extends Notification
{
use Queueable;
public $stagiaire;
Vous pouvez également utiliser la fonction PHP globale session pour récupérer et
stocker des données dans la session. Lorsque l'assistant session est appelé avec un
seul argument de chaîne, il renverra la valeur de cette clé de session. Lorsque
l'assistant est appelé avec un tableau de paires clé/valeur, ces valeurs seront stockées
dans la session : session('key');
Les sessions
Récupération de toutes les données de session
Si vous souhaitez récupérer toutes les données de la session, vous pouvez utiliser la
all méthode : $data = $request->session()->all();
Suppression de données
La forget méthode supprimera une donnée de la session. Si vous souhaitez supprimer
toutes les données de la session, vous pouvez utiliser la flush méthode :
Les sessions
// Forget a single key...
$request->session()->forget('name');
$request->session()->flush();
if (session()->has('error')) ...
Ces informations demeurent pour le même client à travers ses requêtes. Laravel
s’occupe de ces informations, on se contente de lui indiquer un couple clé-valeur et il
s’occupe de tout.
Créer un journal de log personnalisé
Lorsque nous développons une nouvelle application avec le framework Laravel,
surtout dans la phase de développement active, nous aimons bien suivre tout ce qu’il
se passe dans les moindres détails.
Nous avons besoin de suivre ce qu’il se passe. Surtout que certaines de nos
commandes dans Laravel traitent de gros volumes de données. Au final, on se
retrouve à faire des millions d’appels vers des services externes, donc des erreurs
arrivent et on a besoin de savoir précisément où ça coince avant que tout soit stable
des deux cotés.
Le fichier de log par défaut de Laravel
Lorsque vous installez le framework Laravel et que vous commencez à l’utiliser, à
moins que vous soyez très fort, des erreurs vont se produire. C’est normal, je ne
compte plus le nombre d’erreurs que je vois par jour.
Créer un journal de log personnalisé
L’erreur s’affiche alors sur votre navigateur ou dans votre terminal et Laravel va alors
automatiquement remplir le fichier de log de base. Ce fichier se trouve dans le
dossier storage et ensuite dans le sous-dossier logs. Il est par défaut sobrement appelé
laravel.log.
Le chemin exact du fichier de log par défaut dans Laravel est :
/storage/logs/laravel.log
Tout cela, c’est très bien, mais chaque fois qu’une erreur va se produire, peu importe
son origine, elle va remplir ce fichier laravel.log. Ce n’est pas un problème et c’est
très bien d’avoir une trace. Ce fichier laravel.log de base qui est très utile pour
développer son application va malheureusement être un peu trop pollué. C’est pour
cela qu’on va commencé à créer nos propres fichiers journaux d’événements.
Créer un journal de log personnalisé
Logging dans Laravel : le niveau de gravité des messages
Le système de logging de Laravel dispose de plusieurs niveaux d’alerte pour qualifier
la nature des messages. On va en parlé avant de montrer comment créer
techniquement ce nouveau fichier de log personnalisé, car ce concept est important
pour la suite. Si vous voulez par la suite exploiter ce fichier de log facilement, autant
renseigner correctement ses messages dedans.
Voici les différents niveaux de gravité des logs, du plus important au moins
important:
emergency : les erreurs les plus graves, qui nécessitent une intervention immédiate,
comme un système en panne ou un service indisponible.
alert : une très grosse erreur qui doit être corrigée immédiatement, comme une base
de données indisponible.
Créer un journal de log personnalisé
critical : représente une erreur critique, comme une défaillance sur une partie de
votre application ou une API indisponible par exemple.
error : une erreur générique mais qui peut avoir des conséquences importantes,
comme une erreur de syntaxe dans une requête SQL.
warning : ce n’est pas une erreur mais ce que vous mettez derrière ce message mérite
une attention particulière, comme une ressource proche de la limite.
notice : une information intéressante pour le suivi du système, comme un utilisateur
qui se connecte ou une opération réussie.
info : des informations générales sur le système, comme les messages d’initialisation
ou les résultats d’opérations.
debug : les informations de débogage, utiles lorsque vous êtes en train de développer
votre application pour suivre ce qu’il se passe.
Créer un journal de log personnalisé
Bien évidemment, vous pouvez les utiliser comme vous voulez, c’est juste à titre
d’information pour la lecture. Vous pouvez sans souci log une erreur pas grave du
tout dans emergency si vous en avez envie.
Comment ajouter son journal de logs personnalisé dans Laravel
Pour faire fonctionner notre nouveau fichier de log, il faut donc modifier le
fichier : /config/logging.php.
Une fois dans ce fichier, il vous suffit d’ajouter le code suivant dans le tableau
'channels'
général channels : => [
// ...
'custom' => [
'driver' => 'daily',
'path' => storage_path('logs/custom.log'),
'level' => 'debug',
'days' => 7,
],],
Créer un journal de log personnalisé
Dans cet exemple, le canal de journalisation custom est créé avec le driver daily, ce
qui signifie que les messages sont enregistrés dans un fichier journal quotidien. Le
chemin du fichier journal est spécifié par l'option path, qui utilise la fonction
storage_path() pour obtenir le répertoire de stockage de l'application. Le niveau de
gravité du journal est spécifié par l'option level, qui est réglé sur debug pour
enregistrer tous les messages. Enfin, l'option days spécifie la durée de conservation
des fichiers journaux.
Une fois que vous avez créé un nouveau canal de journalisation, vous pouvez
l'utiliser pour enregistrer des messages dans votre application en utilisant la classe
Log de Laravel. Par exemple, pour enregistrer un message d'erreur dans le canal
custom, vous pouvez utiliser le code suivant :
Créer un journal de log personnalisé
use Illuminate\Support\Facades\Log;
Dans cet exemple, la méthode channel est utilisée pour sélectionner le canal custom,
et la méthode error est utilisée pour enregistrer un message d'erreur avec le texte 'Une
erreur s'est produite'. Ce message sera enregistré dans le fichier journal
storage/logs/custom.log.
Cette instruction peut être utilisée n'importe où dans votre code pour enregistrer un
message d'erreur dans le canal de journalisation custom. Cela peut être utile dans des
situations où une erreur se produit et que vous souhaitez enregistrer des informations
sur cette erreur dans le fichier journal pour l'analyser plus tard.