Laravel
Models Migration Relation
Introduction,istallation Strucutre,model,migration Migration,Models,Relation
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 CRUD: Etudiant CRUD: Car CRUD,Recherche: Book
Validation
Exemple :Projets
Api:Laravel +React
Middleware

Seeders & Factories

Authenfication
Layouts





Authentification+Roles

Créer une application qui permet de gérer les utilisteurs (register,login,activer,désactiver,supprimer) selon les roles

Models

Permet de sécuriser l'accés au resources de l'application:

Models/Role

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
class Role extends Model
{   use HasFactory;
    protected $primaryKey="idRole";
    protected $table="roles";
    protected $fillable=['name'];

    public function users()
    {
        return $this->hasMany(User::class,'idRole');
    }
    
 
}

Models/User

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    
    protected $fillable = [
        'name',
        'prenom',
        'idRole',
        'active',
        'email',
        'password',
    ];


    public function role()
    {
        return $this->belongsTo(Role::class,'idRole','idRole');
    }
   
    protected $hidden = [
        'password',
        'remember_token',
    ];

    
    protected $casts = [
        'email_verified_at' =< 'datetime',
        'password' => 'hashed',
    ];
}

Role :Migration

<?php

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('roles', function (Blueprint $table) {
            $table->id('idRole');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('roles');
    }
};

User :Migration

<?php

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('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('prenom');
            $table->foreignId('idRole');
            $table->foreign("idRole")->references("idRole")->on("roles");
            $table->integer('active')->default(0);
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
      
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

Lancer la migration

php artisan migrate
php artisan ui bootstrap --auth
npm install
npm run build

Web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;


Route::get('/', function () {
    return view('welcome');
});


Auth::routes();
Route::get("/registerCompte",[RegisterController::class,'showRegister'])->name("showregister");
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

App\Http\Controllers\Auth\RegisterController

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\Role;
class RegisterController extends Controller
{

  

    use RegistersUsers;


    public function showRegister()
    {
        $listeRoles=Role::all();
        return view("auth.register",compact("listeRoles"));
    }
 
    protected $redirectTo = '/home';

  
    public function __construct()
    {
        $this->middleware('guest');
    }


    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'prenom' => ['required', 'string', 'max:255'],
            'idRole' => ['required', 'string', 'max:255'],

            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

  
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'prenom' => $data['prenom'],
            'idRole' => $data['idRole'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

views/auth/register.blade.php

...
  ....
                        <div class="row mb-3">
                            <label for="name" class="col-md-4 col-form-label text-md-end">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="row mb-3">
                            <label for="prenom" class="col-md-4 col-form-label text-md-end">{{ __('prenom') }}</label>

                            <div class="col-md-6">
                                <input id="prenom" type="text" class="form-control @error('prenom') is-invalid @enderror" name="prenom" value="{{ old('prenom') }}" required autocomplete="prenom" autofocus>

                                @error('prenom')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>


                        <div class="row mb-3">
                            <label for="idRole" class="col-md-4 col-form-label text-md-end">{{ __('Role') }}</label>

                            <div class="col-md-6">
                         <select id="idRole"  class="form-control @error('idRole') is-invalid @enderror" name="idRole" value="{{ old('idRole') }}" required autocomplete="idRole" autofocus>
                         @foreach($listeRoles as $r) <option value="{{$r->idRole}}">{{$r->name}}</option>
@endforeach
                            </select>
                                @error('idRole')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        

                       ....
                       ....

php  artisan serve

Lancer la page register.php

http://127.0.0.1:8000/registerCompte

Lancer la page login.php

http://127.0.0.1:8000/login

layouts/app.blade.php

Modifier le navbar afin d'afficher les informations sur l'utilisateur connecté

...
....
....

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ms-auto">
                        <!-- Authentication Links -->
                        @guest
                            @if (Route::has('login'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
                                </li>
                            @endif

                            @if (Route::has('register'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('showregister') }}">{{ __('Register') }}</a>
                                </li>
                            @endif
                        @else
                            <li class="nav-item dropdown">
                                <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                    {{ Auth::user()->name }} <span style="color:red;"> {{ Auth::user()->role->name }}</span>
                                    @if(Auth::user()->active==0)
                                    <span style="color:yellow;background:#000;">Not Active</span>
                                    @endif
                                    @if(Auth::user()->active==1)
                                    <span style="color:#fff;background:green;"> Active</span>
                                    @endif
                                </a>

                               
.....
....
....

Example d'utilisation:Gestion de Role

Créer le controller UserController afin de tester les role de chaque utilisateur

UserController

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class UserController extends Controller
{
    public function showlistUers()
    {
        $userConnected=Auth::user();
       
        if(Auth::check() &&  ($userConnected->active==1)  && (($userConnected->role->name=="Admin") || ($userConnected->role->name=="SuperAdmin")))
        {
$listeUsers=User::all();
return view("admin.listeUsers",compact("listeUsers"));
        }
        else {
            return redirect("/home");
        }
    }
}

Web

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\UserController;


Route::get('/', function () {
    return view('welcome');
});


Auth::routes();
Route::get("/registerCompte",[RegisterController::class,'showRegister'])->name("showregister");
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get("/admin/users",[UserController::class,"showlistUers"])->name("admin.showlistUers");

Utilisatrion des middleware

Créer un middelware de gestion des role

php artisan make:middleware GestionRole

GestionRole


<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;


class GestionRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next,$role1,$role2): Response
    {
        $userConnectedRole=Auth::user()->role->name;
        //laisser passe
        if($userConnectedRole==$role1 ||  $userConnectedRole==$role2 )
        {
        return $next($request);
        }
        //sinon il n'as pas le droit
        return Response("Vous n'avez pas le droit");

    }
}

Ajouter le middleware GestionRole dans Kernel.php

 protected $middlewareAliases = [
        'gestionRole'=> \App\Http\Middleware\GestionRole::class,
    ....

Ajouter la route dans web.php

 ...
    Route::get("/admin/users2",[UserController::class,"showlistUers"])->middleware("auth")->middleware("gestionRole:Admin,SuperAdmin");
    ....

Tester

http://127.0.0.1:8000/admin/users2