Laravel
Models Migration Relation
Introduction Installation Projet:Structure Strucutre,model,migration Migration,Models,Relation Artisan CLI Migrations:Exemples Models:Exemples Relations:Exemples 1 Relations:Exemples 2
Les Relations
BelongsTo HasOne HasMany BelongsToMany HasManyThrough
Exemples des Relations
Relations:oneToMany,ManyToMany... Relations:Exemples
Exercices
Exercice 1 Exercice 2
Controllers Views Routes
Routes,Controller,Model,view
Les Routes
Définir:Routes Routes avec Paramètres Routes nommées Groupes de routes
Les Controllers
Les Controllers Les Contrôleurs de Ressources
Les Vues
Vues et Blade Templates Blade Layouts et Sections Sous-vues Composants et Slots Contrôles de flux
MVC :CRUD
CRUD: Produit CRUD: Etudiant CRUD: Car CRUD,Recherche: Book
Validation
Exemple :Projets
ORM:Eloquent
Exemple :Transport
Api:Laravel +React
Middleware

Seeders & Factories
Exemples :EFM

Authenfication
TP:Schools Management
Authenfication:React
Layouts
Exercices





Etudiant:CRUD

Migration

php artisan make:migration create_etudiants_table
// database/migrations/yyyy_mm_dd_create_etudiants_table.php

public function up()
{
    Schema::create('etudiants', function (Blueprint $table) {
        $table->id('idEtudiant');
        $table->string('nom');
        $table->string('prenom');
        $table->string('cin');
        $table->timestamps();
    });
}
php artisan migrate

Model

php artisan make:model Etudiant
// app/Models/Etudiant.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Etudiant extends Model
{
protected $table="etudiants";
    protected $primaryKey="idEtudiant";
    protected $fillable = ['nom', 'prenom', 'cin'];
}

Controller

php artisan make:controller EtudiantController
// app/Http/Controllers/EtudiantController.php

namespace App\Http\Controllers;

use App\Models\Etudiant;
use Illuminate\Http\Request;

class EtudiantController extends Controller
{
    // Affiche la liste des étudiants
    public function index()
    {
        $etudiants = Etudiant::all();
//etudiants.index :il faut créer la vue index.blade.php dans le dossier views/etudiants
        return view('etudiants.index', compact('etudiants'));
//compact('etudiants')):permet de créer un tableau etudiants=>$etudiants(contenant les resultats Etudiant::all)
    }

    // Affiche le formulaire de création d'un étudiant
    public function create()
    {
	//etudiants.create :il faut crée la vue create.blade.php dans le dossier views/etudiants
        return view('etudiants.create');
    }

    // Stocke un nouvel étudiant dans la base de données
    public function store(Request $request)
    {
		//$request:est la requete envoyer par le client(Formulaire HTML)
        Etudiant::create($request->all());
		//etudiants.index :c'est le nom de la route et pas le nom d'une vue car on a route('....')
        return redirect()->route('etudiants.index');
    }

   
     // Affiche le formulaire de modification d'un étudiant
     public function edit(int $idEtudiant)
     {
        //find:select * from etudiants where idEtudiant=$idEtudiant
        $etudiant=Etudiant::find($idEtudiant);
       // dd($etudiant);
         return view('etudiants.edit', compact('etudiant'));
     }


     // Met à jour les informations d'un étudiant dans la base de données
    public function update(Request $request, int $idEtudiant) {
    //1.Récupérer l'étudiant à modifie from la base de données
     $etudiant=Etudiant::find($idEtudiant);
    //2.Modifier cet étudiant
        $etudiant->update($request->all());
		//$request->all(): récupérer toutes les inputs envoyer par le formulaire html
        return redirect()->route('etudiants.index');
    }

    // Supprimer un étudiant de la base de données
    public function destroy(int $idEtudiant)
    {
         //1.Récupérer l'étudiant à modifie from la base de données
         $etudiant=Etudiant::find($idEtudiant);
         //2.supprimer cet étudiant
        $etudiant->delete();
        return redirect()->route('etudiants.index');
    }
}
Request $request est un objet qui représente la requête HTTP entrante dans une application Laravel. Il est utilisé pour récupérer des données provenant de l'utilisateur, que ce soit à partir de formulaires POST, d'URL, de cookies, de fichiers, etc. La classe Illuminate\Http\Request fournit diverses méthodes pour accéder à ces données et effectuer différentes opérations liées à la requête.
Rôle de Request $request :
Récupération de données de formulaire :
Permet d'accéder aux données de formulaire envoyées via les requêtes POST.
Exemple :
$nom = $request->input('nom');
Récupération de données d'URL (query parameters) :
Permet d'accéder aux données passées via les paramètres d'URL.
Exemple :
$id = $request->query('id');
Gestion des cookies :
Facilite la récupération des cookies envoyés par le client.
Exemple :
$valeurCookie = $request->cookie('nomDuCookie');
Gestion des fichiers :
Permet de manipuler les fichiers téléchargés via les formulaires.
Exemple :
$fichier = $request->file('nomDuFichier');
Accès aux entêtes (headers) de la requête :
Donne accès aux entêtes de la requête HTTP.
Exemple :
$entete = $request->header('Nom-Entete');
Validation de la requête :
Fournit des méthodes pour valider les données de la requête.
Exemple :
$this->validate($request, [
    'champ' => 'required|max:255',
    // autres règles de validation
]);
Session et redirection :
Permet de gérer la session et de rediriger l'utilisateur.
Exemple :
$request->session()->put('clé', 'valeur');
return redirect('/nouvelle-page');
Structure de Request $request :
La classe Request contient de nombreuses méthodes utiles, mais voici quelques-unes des plus couramment utilisées :
input($key, $default = null) : Récupère la valeur d'un paramètre de la requête. Si la clé n'est pas présente, elle renvoie la valeur par défaut (null par défaut).
$valeur = $request->input('parametre', 'valeurParDefaut');
all() : Récupère toutes les données de la requête sous forme de tableau associatif.
$toutesLesDonnees = $request->all();
has($key) : Vérifie si un paramètre particulier est présent dans la requête.
if ($request->has('parametre')) {
    // Faire quelque chose
}
only($keys) : Récupère uniquement les paramètres spécifiés dans la requête.
$donneesSelectionnees = $request->only(['parametre1', 'parametre2']);
except($keys) : Récupère tous les paramètres de la requête, sauf ceux spécifiés.
$donneesSaufSelection = $request->except(['parametre1', 'parametre2']);

Voici une liste des principales méthodes et attributs disponibles dans la classe Illuminate\Http\Request de Laravel. Notez que cette liste n'est pas exhaustive, et vous pouvez toujours consulter la documentation officielle pour obtenir des informations plus détaillées :

Méthodes Principales :

  1. all() : Récupère toutes les données de la requête sous forme de tableau associatif.
  2. input($key, $default = null) : Récupère la valeur d'un paramètre de la requête.
  3. only($keys) : Récupère uniquement les paramètres spécifiés dans la requête.
  4. except($keys) : Récupère tous les paramètres de la requête, sauf ceux spécifiés.
  5. has($key) : Vérifie si un paramètre particulier est présent dans la requête.
  6. method() : Récupère la méthode HTTP de la requête (GET, POST, PUT, DELETE, etc.).
  7. url() : Récupère l'URL complète de la requête.
  8. path() : Récupère le chemin de l'URL sans le domaine.
  9. query() : Récupère les paramètres de l'URL (query string).
  10. header($key, $default = null) : Récupère la valeur d'un entête spécifique de la requête.
  11. cookie($key, $default = null) : Récupère la valeur d'un cookie spécifique de la requête.
  12. file($key, $default = null) : Récupère les informations sur un fichier téléchargé.
  13. isMethod($method) : Vérifie si la méthode HTTP de la requête correspond à celle spécifiée.
  14. is($pattern) : Vérifie si l'URI de la requête correspond au modèle spécifié.

Attributs Principaux :

  1. attributes : Les données de la requête (équivalent de all()).
  2. request : Les données de la requête (équivalent de all()).
  3. query : Les paramètres de l'URL (query string).
  4. server : Les informations du serveur.
  5. files : Les fichiers téléchargés.
  6. cookies : Les cookies de la requête.
  7. headers : Les entêtes de la requête.

Pour accéder à ces méthodes et attributs, vous pouvez créer une instance de la classe Request dans un contrôleur ou une route et utiliser les méthodes mentionnées ci-dessus.




Routes (web.php)

// routes/web.php

use App\Http\Controllers\EtudiantController;

Route::resource('etudiants', EtudiantController::class);
/*Route::resource :pemet de créer automatiquement les routes pour les fonctions:index,create,edit,update,destroy,show du conctroller EtudiantController
sinon on peut créer route par route :
Route::get("etudiant/","EtudiantController@index");
Route::get("etudiant/create","EtudiantController@create");
...*/
Voici la listes de routes générées par resource pour la racine "etudiants"


Méthodes        Request                   Action              Route Name
GET           /etudiants                  index               etudiants.index
GET           /etudiants/create           create              etudiants.create
POST          /etudiants                  store               etudiants.store
GET           /etudiants/{etudiant}       show                etudiants.show
GET           /etudiants/{etudiant}/edit  edit                etudiants.edit
PUT|PATCH     /etudiants/{etudiant}       update              etudiants.update
DELETE        /etudiants/{etudiant}       destroy             etudiants.destroy

Vues

resources/views/etudiants/index.blade.php :
<!-- Liste des étudiants -->
<h1>Liste des étudiants</h1>

<ul>
    @foreach ($etudiants as $etudiant)
        <li>{{ $etudiant->nom }} {{ $etudiant->prenom }} - {{ $etudiant->cin }}</li>
    @endforeach
</ul>
resources/views/etudiants/create.blade.php :
<!-- Formulaire de création d un étudiant -->
<h1>Créer un nouvel étudiant</h1>

<form action="{{ route('etudiants.store') }}" method="post">
    @csrf
    <label for="nom">Nom:</label>
    <input type="text" name="nom" required><br>

    <label for="prenom">Prénom:</label>
    <input type="text" name="prenom" required><br>

    <label for="cin">CIN:</label>
    <input type="text" name="cin" required><br>

    <button type="submit">Enregistrer</button>
</form>
@csrf dans Laravel est une mesure de sécurité cruciale pour protéger vos applications contre les attaques CSRF. Il est fortement recommandé de l'utiliser dans tous les formulaires qui effectuent des opérations de modification (POST, PUT, PATCH, DELETE, etc.) pour garantir une sécurité adéquate.

Les attaques CSRF sont un type d'attaque malveillante par lequel un attaquant peut forcer un utilisateur authentifié à effectuer une action non autorisée sur votre application. L'attaquant peut y parvenir en injectant un lien ou un bouton malveillant dans une page Web. Lorsque l'utilisateur authentifié clique sur le lien ou le bouton, l'attaque est déclenchée.

La directive @csrf génère un jeton CSRF unique pour chaque session utilisateur. Ce jeton est stocké dans un cookie de session. Lorsque l'utilisateur soumet un formulaire, le jeton CSRF est envoyé avec le formulaire. Le serveur valide ensuite le jeton CSRF pour s'assurer qu'il est valide et qu'il correspond à la session utilisateur.

Veuillez modifier le fichier index.blade.php afin d'ajouter les liens supprimer et modifier


<h1>Liste des étudiants</h1>

<ul>
    @foreach ($etudiants as $etudiant)
        <li>{{ $etudiant->nom }} {{ $etudiant->prenom }} - {{ $etudiant->cin }}
            <a href="/etudiants/{{ $etudiant->idEtudiant }}/edit">Modifier</a>
            <form action="{{ route('etudiants.destroy', $etudiant->idEtudiant) }}" method="post">
    @csrf
    @method('DELETE')
    <input type="submit" value="Supprimer"/>
</form>
        </li>
    @endforeach
</ul></div>
resources/views/etudiants/edit.blade.php :
<!-- Formulaire de modification d'un étudiant -->
<h1>Modifier les informations d un étudiant</h1>

<form action="{{ route('etudiants.update', $etudiant->idEtudiant) }}" method="post">
    @csrf
    @method('PUT')

    <label for="nom">Nom:</label>
    <input type="text" name="nom" value="{{ $etudiant->nom }}" required><br>

    <label for="prenom">Prénom:</label>
    <input type="text" name="prenom" value="{{ $etudiant->prenom }}" required><br>

    <label for="cin">CIN:</label>
    <input type="text" name="cin" value="{{ $etudiant->cin }}" required><br>

    <button type="submit">Enregistrer les modifications</button>
</form>