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





La Validation des inputs

Laravel offre une variété de validateurs intégrés qui peuvent être utilisés pour valider les données entrantes dans une application. Voici une liste de certains des validateurs les plus couramment utilisés, avec des explications et des exemples pour chacun :
required
Le champ doit être présent dans la requête.
'nom' => 'required'
string
Le champ doit être une chaîne de caractères.
'email' => 'string''
numeric
Le champ doit être un nombre (peut être entier ou décimal).
'age' => 'numeric''
integer
Le champ doit être un nombre entier.
'quantite' => 'integer''
boolean
Le champ doit être soit true, false, 1 ou 0.
'est_actif' => 'boolean''
email
Le champ doit être une adresse e-mail valide.
'email' => 'email''
unique:table,column,except,idColumn
Le champ doit être unique dans une table spécifiée (sauf pour une certaine ligne si except et idColumn sont fournis).
'adresse_email' => 'unique:utilisateurs''
max:value
La valeur du champ ne doit pas dépasser une certaine taille ou longueur.
'nom' => 'max:255''
min:value
La valeur du champ doit être au moins d'une certaine taille ou longueur.
'mot_de_passe' => 'min:8''
confirmed
Le champ doit être confirmé par un champ de même nom avec un suffixe _confirmation.
'mot_de_passe' => 'confirmed''
in:foo,bar,...
La valeur du champ doit être dans la liste spécifiée.
'role' => 'in:admin,user,moderator''
date
Le champ doit être une date valide.
'date_naissance' => 'date''
regex:pattern
La valeur du champ doit correspondre à l'expression régulière spécifiée.
'code_postal' => 'regex:/^[0-9]{5}$/'
Validation des inputs :Date
Date obligatoire :
'date_champ' => 'required|date'
Date avec un format spécifique (par exemple, 'Y-m-d') :
'date_champ' => 'date_format:Y-m-d'
Date après une autre date :
'date_fin' => 'after:date_debut'
Date avant une autre date :
'date_debut' => 'before:date_fin'
Date entre deux valeurs spécifiques :
'date_champ' => 'date|between:start_date,end_date'
Date après une certaine période :
'date_champ' => 'after_or_equal:start_date'
Date avant une certaine période :
'date_champ' => 'before_or_equal:end_date'
Date de naissance (pour s'assurer que la personne a un âge minimum) :
'date_naissance' => 'date|before_or_equal:-18 years'
Date de début et de fin pour un intervalle spécifié :
'date_debut' => 'date|required_with:date_fin|before_or_equal:date_fin',
'date_fin' => 'date|required_with:date_debut|after_or_equal:date_debut',
Exemples
Créer la Migration:Founrnisseur
php artisan make:migration create_fournisseurs_table
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('fournisseurs', function (Blueprint $table) {
            $table->id('idFournisseur');
            $table->string('nom');
            $table->string('prenom');
            $table->string('email')->unique();
            $table->integer('age');
            $table->date('dateNaissance');
            $table->string('tel');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('fournisseurs');
    }
};
Créer le Model:Founrnisseur
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Fournisseur extends Model
{
    protected $table = 'fournisseurs';
    protected $primaryKey="idFournisseur";
    protected $fillable = ['nom', 'prenom', 'email', 'age', 'dateNaissance', 'tel'];


    use HasFactory;
}
Créer le controlleur:FournisseurController
php artisan make:controller FournisseurController
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Fournisseur;
class FournisseurController extends Controller
{
    public function ajouter()
    {
        return view('fournisseurs.ajouter'); 
        /*fournisseurs.ajouter
           fournisseurs:c'est un dossier dans ressources/views
           ajouter: c'est la vue ajouter.blade.php dans le dossier fournisseurs

        */
    }


 

    public function sauvegarder(Request $request)
    {
        // Validation des champs
        $validatedData = $request->validate([
            'nom' => 'required|string|max:255',
            'prenom' => 'required|string|max:255',
            'email' => 'required|email|unique:fournisseurs,email',
            'age' => 'required|integer|min:0',
            'dateNaissance' => 'required|date',
            'tel' => 'required|string|max:20',
        ], [
            'nom.required' => 'Le champ nom est requis.',
            'prenom.required' => 'Le champ prénom est requis.',
            'email.required' => 'Le champ email est requis.',
            'email.email' => 'L\'adresse email doit être une adresse email valide.',
            'email.unique' => 'Cette adresse email est déjà utilisée.',
            'age.required' => 'Le champ âge est requis.',
            'age.integer' => 'L\'âge doit être un nombre entier.',
            'age.min' => 'L\'âge ne peut pas être négatif.',
            'dateNaissance.required' => 'Le champ date de naissance est requis.',
            'dateNaissance.date' => 'La date de naissance doit être une date valide.',
            'tel.required' => 'Le champ téléphone est requis.',
            'tel.max' => 'Le numéro de téléphone ne peut pas dépasser 20 caractères.',
        ]);

        // Si la validation réussit, vous pouvez créer le Fournisseur
        Fournisseur::create($validatedData);

        // Redirection ou autre action après ajout du Fournisseur
        return redirect()->route('fournisseurs.listeFournisseurs')->with('success', 'Fournisseur ajouté avec succès!');
        /*
        envoyer le  message "success" via la route  fournisseurs.listeFournisseurs */
    }


    public function listeFournisseurs()
    {
        $listeF=Fournisseur::all();
        return view('fournisseurs.index',compact('listeF'));
    }
}
Ajouter les routes:web.php
 use App\Http\Controllers\FournisseurController;
Route::get('/fourinsseurs/add',[FournisseurController::class,'ajouter'])->name('fournisseurs.ajouter');
Route::post('/fournisseurs',[FournisseurController::class,'sauvegarder'])->name('fournisseurs.sauvegarder');
Route::get('/fournisseurs',[FournisseurController::class,'listeFournisseurs'])->name('fournisseurs.listeFournisseurs');
Ajouter la vue :fournisseurs.ajouter

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajouter un Fournisseur</title>
</head>
<body>

<style>
    .errorvalidation{color:red;}
    </style>
    <h1>Ajouter un Fournisseur</h1>


    {{-- Formulaire d'ajout de Fournisseur --}}
    <form method="POST" action="{{ route('fournisseurs.sauvegarder') }}">
        @csrf

        <label for="nom">Nom :</label>
        <input type="text" name="nom" value="{{ old('nom') }}">
        <!-- afficher le message d'erreur de la validation du chams nom-->
          @error('nom')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <label for="prenom">Prénom :</label>
        <input type="text" name="prenom" value="{{ old('prenom') }}">
        @error('prenom')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <label for="email">Email :</label>
        <input type="text" name="email" value="{{ old('email') }}">
        @error('email')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <label for="age">Âge :</label>
        <input type="text" name="age" value="{{ old('age') }}">
        @error('age')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <label for="dateNaissance">Date de Naissance :</label>
        <input type="text" name="dateNaissance" value="{{ old('dateNaissance') }}">
        @error('dateNaissance')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <label for="tel">Téléphone :</label>
        <input type="text" name="tel" value="{{ old('tel') }}">
        @error('tel')
              <span class="errorvalidation">{{$message}}</span>
           @enderror
        <br>

        <button type="submit">Ajouter</button>
    </form>



  <h1>On peut afficher pour chaque champs sont error de validation </h1>
  OU
  <h1>Afficher tous les messages d'erreurs de  la validation  de tous les champs</h1>


<!--
$errors:un objet contient les erreurs envoyer par $request->validate() 
any():vérifier si on a ou moins une erreur
foreach:boucler sur les erreurs en les affichant one by one
-->
    @if($errors->any())
        <div style="color: red;">
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

</body>
</html>
Ajouter la vue :fournisseurs.index
<h1>Liste Fournisseurs</h1>
<table>
    <thead>
        <th>ID_Fournisseur</th>
        <th>Nom</th>
        <th>Prénom</th>
        <th>Age</th>
        <th>Email</th>
        <th>Date Naissance</th>
        <th>Tel</th>
</thead>
<tbody>
    @foreach($listeF as $f)
    <tr>
    <td>{{$f->idFournisseur}}</td>
    <td>{{$f->nom}}</td>
    <td>{{$f->prenom}}</td>
    <td>{{$f->age}}</td>
    <td>{{$f->email}}</td>
    <td>{{$f->dateNaissance}}</td>
    <td>{{$f->tel}}</td>

</tr>
    @endforeach
</tbody>
</table>

<!-- afficher le message envoyer par with('success', 'Fournisseur ajouté avec succès!'); -->
@if(session("success"))
 {{session('success')}}
@endif