Laravel Résumé
Models Migration Relation
Introduction Installation Projet:Structure Strucutre,model,migration Migration,Models,Relation Artisan CLI
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
Queue,job,task
TP:Schools Management
Authenfication:React
Layouts
Exercices





Projet:Backend (Laravel)

Projet social media (share posts) réalisé par :Aya Berrouan

Description du projet

  • Application"share posts" permet aux administrateurs de gérer les utilisateurs en effectuant des opérations telles que la création, la modification, la suppression et l'activation/désactivation des comptes utilisateur. Les utilisateurs peuvent être associés à différents rôles, tels que SuperAdmin, Admin, Modérateur, etc., avec des autorisations différentes. L'application comprend également un système d'authentification pour permettre aux utilisateurs de se connecter et d'accéder à leurs profils. En plus de la gestion des utilisateurs, l'application permet également de créer, afficher, modifier et supprimer des articles de blog, associés à des thèmes spécifiques.

Tables

roles("idRole", "nomRole");
utilisateurs("id","nom","prenom","email","password","idRole","active", photo);
themes("idTheme","titreTheme","descriptionTheme","photoTheme");
posts("idPost","titrePost","contenuPost","idTheme","idUtilisateur", "active", imagePost);

Design

Projet Social Media

Migrations

create_roles_table.php

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  public function up(): void
  {
    Schema::create('roles', function (Blueprint $table) {
      $table->id("idRole");
      $table->string('nomRole');
      $table->timestamps();
    });
  }

  public function down(): void
  {
    Schema::dropIfExists('roles');
  }
};

create_utilisateurs_table.php

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  public function up(): void
  {
    Schema::create('utilisateurs', function (Blueprint $table) {
      $table->id();
      $table->string('nom');
      $table->string('prenom');
      $table->string('email')->unique();
      $table->timestamp('email_verified_at')->nullable();
      $table->string('photo')->nullable();
      $table->string('password');
      $table->unsignedBigInteger('idRole');
      $table->foreign('idRole')->references('idRole')->on('roles')->onDelete("cascade");
      $table->integer("active")->default(0);
      $table->rememberToken();
      $table->timestamps();
    });
  }

  public function down(): void
  {
    Schema::dropIfExists('utilisateurs');
  }
};

create_themes_table.php

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  public function up(): void
  {
    Schema::create('themes', function (Blueprint $table) {
      $table->id("idTheme");
      $table->string("titreTheme");
      $table->string("descriptionTheme");
      $table->string("photoTheme");
      $table->timestamps();
    });
  }

  public function down(): void
  {
    Schema::dropIfExists('themes');
  }
};

create_posts_table.php

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  public function up(): void
  {
    Schema::create('posts', function (Blueprint $table) {
      $table->id("idPost");
      $table->string("titrePost");
      $table->string("contenuPost");
      $table->unsignedBigInteger("idTheme");
      $table->foreign("idTheme")->references("idTheme")->on("themes")->onDelete("cascade");
      $table->unsignedBigInteger("idUtilisateur");
      $table->foreign("idUtilisateur")->references("id")->on("utilisateurs")->onDelete("cascade");
      $table->integer("active")->default(0);
      $table->timestamps();
    });
  }

  public function down(): void
  {
    Schema::dropIfExists('posts');
  }
};

Role.php

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
  use HasFactory;

  protected $table = 'roles';
  protected $primaryKey = 'idRole';
  protected $fillable = ['nomRole'];
  public $timestamps = true;


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

Utilisateur.php

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Utilisateur extends Authenticatable
{
  use HasFactory, Notifiable;

  /**
  * @var array<int, string>
  */
  protected $fillable = ['nom','prenom','email','password','idRole','active', "photo"];
  public $timestamps = true;

  /**
  *
  * @var array<int, string>
  */
  protected $hidden = [
    'password',
    'remember_token',
  ];

  /**
  * @return array<string, string>
  */
  protected function casts(): array
  {
    return [
      'email_verified_at' => 'datetime',
      'password' => 'hashed',
    ];
  }

  public function role(){
    return $this->belongsTo(Role::class, 'idRole', 'idRole');
  }

  public function post(){
    return $this->hasMany(Post::class, 'idUtilisateur', 'id');
  }
}

Theme.php

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Theme extends Model
{
  use HasFactory;

  protected $table = 'themes';
  protected $primaryKey = 'idTheme';
  protected $fillable = ['titreTheme','descriptionTheme','photoTheme'];
  public $timestamps = true;


  public function posts(){
    return $this->hasMany(Post::class, 'idTheme', 'idTheme');
  }
}

Post.php

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
  use HasFactory;

  protected $table = 'posts';
  protected $primaryKey = 'idPost';
  protected $fillable = ['titrePost','contenuPost','idTheme','idUtilisateur','active', "imagePost"];
  public $timestamps = true;

  public function utilisateur(){
    return $this->belongsTo(Utilisateur::class, 'idUtilisateur', 'id');
  }

  public function theme(){
    return $this->belongsTo(Theme::class, 'idTheme', 'idTheme');
  }
}

Controllers

Auth/RegisterController.php

RegisterController
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\Utilisateur;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\Role;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;


class RegisterController extends Controller
{
    protected $redirectTo = '/home';

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

        public function showRegistrationForm()
    {
        $roles = Role::all();
        return view('auth.register', compact('roles'));
    }

    protected function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'nom' => ['required', 'string', 'max:255'],
            'prenom' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'idRole' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }

        $user = Utilisateur::create([
            'nom' => $request->input('nom'),
            'prenom' => $request->input('prenom'),
            'email' => $request->input('email'),
            'idRole' => $request->input('idRole'),
            'password' => Hash::make($request->input('password')),
        ]);

        return redirect('/login');
    }
}

Auth/LoginController.php

LoginController
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

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

    protected function loggedOut()
    {
        return redirect('/login');
    }
}

RoleController.php

Liste des rôles

RoleController

Ajouter un rôle

RoleController

Modifier un rôle

RoleController
<?php
namespace App\Http\Controllers;
use App\Models\Role;
use Illuminate\Http\Request;

class RoleController extends Controller
{
  public function index()
  {
    $roles = Role::all();
    return view('roles.index', compact('roles'));
  }

  public function create()
  {
    return view('roles.create');
  }

  public function store(Request $request)
  {
    $request->validate([
      'nomRole' => 'required',
    ]);

    Role::create($request->all());

    return redirect()->route('roles.index')
      ->with('success', 'Role est bien ajouté.');
  }

  public function edit($id)
  {
    $role = Role::find($id);
    return view('roles.edit', compact('role'));
  }

  public function update(Request $request, $id)
  {
    $request->validate([
      'nomRole' => 'required',
    ]);

    $role = Role::find($id);
    $role->update($request->all());

    return redirect()->route('roles.index')
      ->with('success', 'Role est bien modifié.');
  }

  public function destroy($id)
  {
    $role = Role::find($id);
    $role->delete();

    return redirect()->route('roles.index')
      ->with('success', 'Role est bien supprimé.');
  }
}

UtilisateurController.php

Liste des utilisateurs

UtilisateurController

Modifier un utilisateur

UtilisateurController
<?php
namespace App\Http\Controllers;
use App\Models\Utilisateur;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Models\Role;
use Illuminate\Support\Facades\Auth;

class UtilisateurController extends Controller
{
    
// Récupère les utilisateurs en fonction du statut et les affiche dans la vue index.
  public function index(Request $request)
  {
    $status = $request->input('status');

    if ($status === 'active') {
      $utilisateurs = Utilisateur::where('active', 1)->get();
    } elseif ($status === 'inactive') {
      $utilisateurs = Utilisateur::where('active', 0)->get();
    } else {
      $utilisateurs = Utilisateur::all();
    }

    return view('utilisateurs.index', compact('utilisateurs'));
  }

  public function edit($id)
  {
    $utilisateur = Utilisateur::find($id);
    $roles = Role::all();
    return view('utilisateurs.edit', compact('utilisateur', 'roles'));
  }

  public function update(Request $request, $id)
  {
    $validator = Validator::make($request->all(), [
      'nom' => 'required',
      'prenom' => 'required',
      'email' => 'required',
      'password' => 'required',
      'idRole' => 'required',
    ]);

    if ($validator->fails()) {
      return redirect()->back()->withErrors($validator)->withInput();
    }

    $utilisateur = Utilisateur::find($id);
    $utilisateur->update($request->all());

    return redirect()->route('home')
      ->with('success', 'Utilisateur est bien modifié.');
  }

  public function destroy($id)
  {
    $utilisateur = Utilisateur::find($id);
    $utilisateur->delete();
    return redirect()->route('home')->with('success', 'Utilisateur est bien supprimé.');
  }

// Activation des utilisateurs
  public function activate($id)
  {
    $utilisateur = Utilisateur::find($id);
    $utilisateur->active = 1;
    $utilisateur->save();

    return redirect()->route('utilisateurs.index')
      ->with('success', 'Utilisateur est bien activé.');
  }

// Désactivation des utilisateurs
  public function desactivate($id)
  {
    $utilisateur = Utilisateur::find($id);
    $utilisateur->active = 0;
    $utilisateur->save();

    return redirect()->route('utilisateurs.index')
      ->with('success', 'Utilisateur est bien désactivé.');
  }

  public function show($id)
  {
    $utilisateur = Utilisateur::find($id);
    return view('utilisateurs.show', compact('utilisateur'));
  }
// Ajouter une image de profil
  public function uploadImage(Request $request, $id)
  {
    $utilisateur = Utilisateur::find($id);
    $request->validate([
      'photo' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
    ]);

    $file = $request->file("photo");
    if ($file) {
      $extension = $file->getClientOriginalExtension();
      $taille = $file->getSize();
      if ($extension != "jpg" && $extension != "jpeg" && $extension != "png" && $taille > 1000000) {
        return back()->with("msg", "L'image doit être au format jpg, png ou jpeg et de taille inférieure à 10M");
      } else {
        $dossier = "images";
        $n_unique = uniqid();
        $lienPhoto = $dossier . "/" . $n_unique . "_" . $file->getClientOriginalName();
        $file->move("images", $n_unique . "_" . $file->getClientOriginalName());
        $utilisateur->photo = $lienPhoto;
        $utilisateur->save();
      }
    }

    return redirect()->route('utilisateurs.show', $id)
      ->with('success', 'Image est bien ajoutée.');
  }

  public function destroyProfile($id)
  {
    $utilisateur = Utilisateur::find($id);
    $utilisateur->delete();
    return redirect()->route('login')->with('success', 'Votre compte a été supprimé avec succès.');
  }
}

ThemeController.php

Liste des thèmes

ThemeController

Ajouter un thème

ThemeController

Modifier un thème

ThemeController
<?php
namespace App\Http\Controllers;
use App\Models\Theme;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ThemeController extends Controller
{
  public function index()
  {
    $themes = Theme::all();
    return view('themes.index', compact('themes'));
  }

  public function create()
  {
    return view('themes.create');
  }

  public function store(Request $request)
  {
    $validator = Validator::make($request->all(), [
      'titreTheme' => 'required',
      'descriptionTheme' => 'required',
      'photoTheme' => 'required|mimes:png,jpg,jpeg|max:2000000',
    ]);

    if($validator->fails()){
      return back()->withErrors($validator->errors())->withInput();
    }

    $file = $request->file("photoTheme");
    if($file){
      $extension = $file->getClientOriginalExtension();
      $taille = $file->getSize();
      if($extension != "jpg" and $extension != "jpeg" and $extension != "png" and $taille > 1000000){
        return back()->with("msg", "taille".$taille."image doit être jpg, png ou jpeg et de taille < 10M");
      }else{
        $dossier = "images";
        $n_unique = uniqid();
        $lienPhoto = $dossier."/".$n_unique."_".$file->getClientOriginalName();

        $file->move("images", $n_unique."_".$file->getClientOriginalName());

        $theme = $request->post();
        $theme["photoTheme"]= $lienPhoto;

        Theme::create($theme);
        return back()->with("msg", "Le theme est bien ajouté");
      }
    }else{
      return back()->with("msg", "Aucun fichier sélectionné");
    }
  }

  public function edit($id)
  {
    $theme = Theme::find($id);
    return view('themes.edit', compact('theme'));
  }

  public function update(Request $request, $id)
  {
    $validator = Validator::make($request->all(), [
      'titreTheme' => 'required',
      'descriptionTheme' => 'required',
      'photoTheme' => 'mimes:png,jpg,jpeg|max:2000000',
    ]);

    if ($validator->fails()) {
      return redirect()->back()
        ->withErrors($validator)
        ->withInput();
    }

    $theme = Theme::find($id);

    $file = $request->file("photoTheme");
    if ($file) {
      $extension = $file->getClientOriginalExtension();
      $taille = $file->getSize();
      if ($extension != "jpg" && $extension != "jpeg" && $extension != "png" && $taille > 1000000) {
        return back()->with("msg", "L'image doit être au format jpg, png ou jpeg et de taille inférieure à 10M");
      } else {
        $dossier = "images";
        $n_unique = uniqid();
        $lienPhoto = $dossier . "/" . $n_unique . "_" . $file->getClientOriginalName();
        $file->move("images", $n_unique . "_" . $file->getClientOriginalName());
        $theme->photoTheme = $lienPhoto;
      }
    }

    $theme->titreTheme = $request->input('titreTheme');
    $theme->descriptionTheme = $request->input('descriptionTheme');
    $theme->update();

    return redirect()->route('themes.index')
      ->with('success', 'Le thème a été modifié avec succès.');
  }

  public function destroy($id)
  {
    $theme = Theme::find($id);
    $theme->delete();

    return redirect()->route('themes.index')
      ->with('success', 'Theme est bien supprimé.');
  }
}

PostController.php

Liste des posts des utilisateurs affichée dans la partie SuperAdmin, permettant d'activer ou de désactiver les comptes d'utilisateurs.

PostController

Liste des posts de l'utilisateur

PostController

Ajouter un post

PostController

Modifier un post

PostController
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Models\Theme;
use App\Models\Utilisateur;
use Illuminate\Support\Facades\Auth;

class PostController extends Controller
{
// Affiche tous les posts qui sont actifs
  public function indexAll()
  {
    $posts = Post::where('active', 1)->get();
    $themes = Theme::all();
    return view('home', compact('posts', 'themes'));
  }

  // Affiche les posts de l'utilisateur connecté
  public function index(Request $request)
  {
    $userRole = Auth::user()->role->nomRole;
    $posts = Post::all();
    if ($userRole !== 'Admin' && $userRole !== 'SuperAdmin' && $userRole !== 'Moderateur') {
      $posts = $posts->where('idUtilisateur', Auth::id());
    }
    $status = $request->input('statut');

    if ($status === 'active') {
      $posts = $posts->where('active', 1);
    } elseif ($status === 'inactive') {
      $posts = $posts->where('active', 0);
    }

    $themes = Theme::all();
    $utilisateurs = Utilisateur::all();

    return view('posts.index', compact('posts', 'themes', 'utilisateurs'));
  }

  public function create()
  {
    $themes = Theme::all();
    $utilisateurs = Utilisateur::all();
    return view('posts.create', compact('themes', 'utilisateurs'));
  }

  public function store(Request $request)
  {
    $validator = Validator::make($request->all(), [
      'titrePost' => 'required',
      'contenuPost' => 'required',
      'idTheme' => 'required',
    ]);

    if ($validator->fails()) {
      return redirect()->back()
        ->withErrors($validator)
        ->withInput();
    }

    $file = $request->file("imagePost");
    if ($file) {
      $extension = $file->getClientOriginalExtension();
      $taille = $file->getSize();
      if ($extension != "jpg" && $extension != "jpeg" && $extension != "png" && $taille > 1000000) {
        return back()->with("msg", "L'image doit être au format jpg, png ou jpeg et de taille inférieure à 10M");
      }

    }
    $dossier = "images";
    $n_unique = uniqid();
    $lienPhoto = $dossier . "/" . $n_unique . "_" . $file->getClientOriginalName();
    $file->move("images", $n_unique . "_" . $file->getClientOriginalName());

    $userId = Auth::id();
    $postData = $request->post();
    $postData['idUtilisateur'] = $userId;
    $postData['active'] = $request->has('active') ? 1 : 0;
    $postData['imagePost'] = $lienPhoto;


    Post::create($postData);

    return redirect()->route('posts.index')
      ->with('success', 'Post est bien ajouté.');
  }

  public function edit($id)
  {
    $post = Post::find($id);
    $themes = Theme::all();
    $utilisateurs = utilisateur::all();
    return view('posts.edit', compact('post', 'themes', 'utilisateurs'));
  }

  public function update(Request $request, $id)
  {
    $validator = Validator::make($request->all(), [
      'titrePost' => 'required',
      'contenuPost' => 'required',
      'idTheme' => 'required',
      'idUtilisateur' => 'required',
    ]);

    if ($validator->fails()) {
      return redirect()->back()
        ->withErrors($validator)
        ->withInput();
    }

    $file = $request->file("imagePost");
    if ($file) {
      $extension = $file->getClientOriginalExtension();
      $taille = $file->getSize();
      if ($extension != "jpg" && $extension != "jpeg" && $extension != "png" && $taille > 1000000) {
        return back()->with("msg", "L'image doit être au format jpg, png ou jpeg et de taille inférieure à 10M");
      }

    }
    $dossier = "images";
    $n_unique = uniqid();
    $lienPhoto = $dossier . "/" . $n_unique . "_" . $file->getClientOriginalName();
    $file->move("images", $n_unique . "_" . $file->getClientOriginalName());


    $post = Post::find($id);
    $postData = $request->post();
    $postData['active'] = $request->has('active') ? 1 : 0;
    $postData['imagePost'] = $lienPhoto;

    $post->update($postData);

    return redirect()->route('posts.index')
      ->with('success', 'Post est bien mis à jour.');
  }

  public function destroy($id)
  {
    $post = Post::find($id);
    $post->delete();

    return redirect()->route('posts.index')
      ->with('success', 'Post est bien supprimé.');
  }

// Activation des posts
  public function activate($id)
  {
    $post = Post::find($id);
    $post->active = 1;
    $post->save();

    return redirect()->route('posts.index')
      ->with('success', 'Post est bien activé.');
  }

// Désactivation des posts
  public function desactivate($id)
  {
    $post = Post::find($id);
    $post->active = 0;
    $post->save();

    return redirect()->route('posts.index')
      ->with('success', 'Post est bien désactivé.');
  }

// Affiche les posts en fonction du thème
  public function indexByTheme(Request $request)
  {
    $themeId = $request->input('theme');
    if ($themeId) {
      $posts = Post::where('idTheme', $themeId)->where('active', 1)->get();
    } else {
      $posts = Post::where('active', 1)->get();
    }
    $themes = Theme::all();
    return view('home', compact('posts', 'themes'));
  }

// Recherche des posts par titre post
  public function search(Request $request)
  {
    $search = $request->input('titrePost');
    $posts = Post::where('titrePost', 'like', "%" . $search . "%")->get();
    $themes = Theme::all();
    return view('home', compact('posts', 'themes'));
  }
}

Middleware

RoleMiddleware.php

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;

class RoleMiddleware
{
// Vérifie si l'utilisateur est connecté et s'il a le rôle requis
  public function handle(Request $request, Closure $next, ...$roles)
  {
    // Si l'utilisateur n'est pas autorisé, retourne une erreur 403
    if (!$request->user() || !in_array($request->user()->role->nomRole, $roles)) {
      abort(403, 'Unauthorized action.');
    }
    // Si l'utilisateur est autorisé, continue la requête
    return $next($request);
  }
}

Routes

web.php

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\RoleController;
use App\Http\Controllers\UtilisateurController;
use App\Http\Controllers\ThemeController;
use App\Http\Controllers\PostController;
use App\Http\Middleware\RoleMiddleware;

// Middleware Role
Route::get('/roles', [RoleController::class, 'index'])->name('roles.index')->middleware(RoleMiddleware::class);

// Routes Authentification
Auth::routes();
Route::get('/home', [PostController::class, 'indexAll'])->name('home');
Route::get('register', [RegisterController::class, 'showRegistrationForm'])->name('register');
Route::post('register', [RegisterController::class, 'register'])->name('register');
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/logout', [LoginController::class, 'logout'])->name('logout');

// Routes roles
Route::middleware(['auth', RoleMiddleware::class . ':Admin,SuperAdmin,Moderateur'])->group(function () {
  Route::resource('roles', RoleController::class);
});

// Routes utilisateurs
Route::get('/utilisateurs', [UtilisateurController::class, 'index'])->name('utilisateurs.index')->middleware('auth')->middleware(RoleMiddleware::class . ':Admin,SuperAdmin,Moderateur');
Route::get('/utilisateurs/{id}/edit', [UtilisateurController::class, 'edit'])->name('utilisateurs.edit')->middleware('auth');
Route::put('/utilisateurs/{id}', [UtilisateurController::class, 'update'])->name('utilisateurs.update')->middleware('auth');
Route::delete('/utilisateurs/{id}', [UtilisateurController::class, 'destroy'])->name('utilisateurs.destroy')->middleware('auth');
Route::get('/utilisateurs/{id}', [UtilisateurController::class, 'show'])->name('utilisateurs.show')->middleware('auth');
Route::post('/utilisateurs/{id}/activate', [UtilisateurController::class, 'activate'])->name('users.activate')->middleware('auth');
Route::post('/utilisateurs/{id}/desactivate', [UtilisateurController::class, 'desactivate'])->name('users.desactivate')->middleware('auth');
Route::post('/utilisateurs/{id}/uploadImage', [UtilisateurController::class, 'uploadImage'])->name('utilisateurs.uploadImage')->middleware('auth');
Route::delete("/utilisateurs/{id}/destroyProfile", [UtilisateurController::class, 'destroyProfile'])->name('destroyProfile')->middleware('auth');

// Routes themes
Route::middleware(['auth', RoleMiddleware::class . ':Admin,SuperAdmin,Moderateur'])->group(function () {
  Route::resource('themes', ThemeController::class);
});

// Routes posts
Route::post('/posts/by-theme', [PostController::class, 'indexByTheme'])->name('posts.indexByTheme');
Route::get('/posts', [PostController::class, 'index'])->name('posts.index')->middleware('auth');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create')->middleware('auth');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store')->middleware('auth');
Route::get('/posts/{id}/edit', [PostController::class, 'edit'])->name('posts.edit')->middleware('auth');
Route::put('/posts/{id}', [PostController::class, 'update'])->name('posts.update')->middleware('auth');
Route::delete('/posts/{id}', [PostController::class, 'destroy'])->name('posts.destroy')->middleware('auth');
Route::post('/posts/{id}/activate', [PostController::class, 'activate'])->name('posts.activate')->middleware('auth');
Route::post('/posts/{id}/desactivate', [PostController::class, 'desactivate'])->name('posts.desactivate')->middleware('auth');
Route::get('/posts/search', [PostController::class, 'search'])->name('posts.search');

Views

layouts/app.blade.php


<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Font awesome -->
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <!-- Favicon -->
    <title>Share posts || @yield("title")</title>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.bunny.net">
    <link href="https://fonts.bunny.net/css?family=Nunito" rel="stylesheet">

    <!-- Scripts -->
    @vite(['resources/sass/app.scss', 'resources/js/app.js'])
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
            <div class="container">
                <a class="navbar-brand" href="{{ url('/home') }}">
                    <img src="{{ asset('logo.png') }}" alt="Logo" width="170" style="margin-top: -10px">
                </a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <!-- Left Side Of Navbar -->
                    <ul class="navbar-nav me-auto">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ms-auto">
                        @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('register') }}">{{ __('Register') }}</a>
                                </li>
                            @endif
                        @else
                            @if(Auth::user()->role->nomRole === 'Utilisateur')
                                <li class="nav-item mt-2" >
                                    <a class="nav-link" href="/posts">Liste des posts</a>
                                </li>

                            @elseif(Auth::user()->role->nomRole === 'Admin')
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/posts">Liste des posts</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/utilisateurs">Liste des utilisateurs</a>
                                </li>
                            @elseif(Auth::user()->role->nomRole === 'Moderateur')
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/posts">Liste des posts</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/utilisateurs">Liste des utilisateurs</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/themes">Liste des thèmes</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/roles">Liste des rôles</a>
                                </li>
                            @elseif(Auth::user()->role->nomRole === 'SuperAdmin')
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/posts">Liste des posts</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/utilisateurs">Liste des utilisateurs</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/roles">Liste des rôles</a>
                                </li>
                                <li class="nav-item mt-2">
                                    <a class="nav-link" href="/themes">Liste des thèmes</a>
                                </li>
                            @endif

                            <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>
                                    @if(Auth::user()->photo)
                                        <img src="/{{ Auth::user()->photo }}" >
                                    @else
                                        <img src="https://avatar.iran.liara.run/public/{{ rand(1,20) }}">
                                    @endif
                                    {{ Auth::user()->nom }} {{ Auth::user()->prenom }}
                                </a>

                                <div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
                                    <a class="dropdown-item" href="/utilisateurs/{{ Auth::user()->id }}">Profil</a>
                                    <a class="dropdown-item" href="{{ route('logout') }}"
                                        onclick="event.preventDefault();
                                                    document.getElementById('logout-form').submit();">
                                        {{ __('Logout') }}
                                    </a>

                                    <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                                        @csrf
                                    </form>
                                </div>
                            </li>
                        @endguest
                    </ul>
                </div>
            </div>
        </nav>

        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>

SuperAdmin Layout

Utilisateur Layout

auth/register.blade.php


@extends('layouts.app')
@section('title', 'Register')
@section('content')

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Register') }}</div>
                <div class="card-body">
                    <form method="POST" action="{{ route('register') }}">
                        @csrf

                        <div class="mb-3">
                            <label for="nom" class="form-label">{{ __('Nom') }}</label>
                            <input id="nom" type="text" class="form-control @error('nom') is-invalid @enderror" name="nom" value="{{ old('nom') }}" required autocomplete="nom" autofocus>
                            @error('nom')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="mb-3">
                            <label for="prenom" class="form-label">{{ __('Prénom') }}</label>
                            <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 class="mb-3">
                            <label for="email" class="form-label">{{ __('Adresse Email') }}</label>
                            <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
                            @error('email')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="mb-3">
                            <label for="password" class="form-label">{{ __('Mot de passe') }}</label>
                            <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
                            @error('password')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="mb-3">
                            <label for="password-confirm" class="form-label">{{ __('Confirmer le mot de passe') }}</label>
                            <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                        </div>

                        <div class="mb-3">
                            <label for="idRole" class="form-label">{{ __('Rôle') }}</label>
                            <select id="idRole" class="form-control @error('idRole') is-invalid @enderror" name="idRole" required>
                                <option value="">-- Choisir un rôle --</option>
                                @foreach($roles as $role)
                                    <option value="{{ $role->idRole }}">{{ $role->nomRole }}</option>
                                @endforeach
                            </select>
                            @error('idRole')
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                            @enderror
                        </div>

                        <div class="mb-3">
                            <button type="submit" class="btn btn-primary">{{ __('Register') }}</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
register

auth/login.blade.php


@extends('layouts.app')
@section('title', 'Login')
@section('content')

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('login') }}">
                        @csrf

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

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

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

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

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

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

                        <div class="row mb-3">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>

                                @if (Route::has('password.request'))
                                    <a class="btn btn-link" href="{{ route('password.request') }}">
                                        {{ __('Forgot Your Password?') }}
                                    </a>
                                @endif
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
login

home.blade.php


@extends('layouts.app')
@section('title', 'Home')
@section('content')

<div>
    <div>
        <div>
            <div>
                <div>
                    @foreach($posts as $post)
                    <div>
                        <div>
                            <div>
                                <img src="/{{ $post->imagePost }}" alt="">
                                <div></div>
                            </div>
                            <div>
                                <small>{{ $post->created_at }}</small>
                                <small><a href="#">{{ $post->theme->titreTheme }}</a></small>
                                <h4><a href="#">{{ $post->titrePost }}</a></h4>
                                <p>{{ $post->contenuPost }}</p>
                                <div>
                                    <img src="/{{ $post->utilisateur->photo }}" alt="">
                                    <div>
                                        <h6>{{ $post->utilisateur->nom }} {{ $post->utilisateur->prenom }}</h6>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    @endforeach
                </div>
            </div>
            <div>
                <div>
                    <div>
                        <form method="GET" action="{{ route('posts.search') }}">
                            <div>
                                <div>
                                    <span><i class="fa fa-search"></i></span>
                                </div>
                                <input type="text" name="titrePost" placeholder="Rechercher...">
                                <div>
                                    <button type="submit">Rechercher</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
                <div>
                    <div>
                        <h2>Themes</h2>
                    </div>
                    <div>
                        <form method="POST" action="{{ route('posts.indexByTheme') }}">
                            @csrf
                            <div>
                                <a href="/home" type="submit" name="theme" value="all">
                                    <img src="https://cdn-icons-png.flaticon.com/512/2603/2603910.png" alt="theme">
                                    Tous</a>
                            </div>
                            @foreach($themes as $theme)
                                <div>
                                    <button type="submit" name="theme" value="{{ $theme->idTheme }}">
                                        <img src="/{{ $theme->photoTheme }}" alt="theme">
                                        <span>{{ $theme->titreTheme }}</span>
                                    </button>
                                </div>
                            @endforeach
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

roles/index.blade.php


@extends('layouts.app')
@section('title', 'Liste rôles')
@section('content')

<div>
    <a href="/roles/create">Ajouter un nouveau rôle</a>
</div>
<div>
    <div>
        Liste des rôles
    </div>
    <div>
        <div>
            @foreach ($roles as $role)
            <div>
                <div>
                    <img src="https://avatar.iran.liara.run/public/{{ rand(1,20) }}" alt="">
                </div>
                <div>
                    <h4>{{ $role->nomRole }}</h4>
                </div>
                <div>
                    <a href="/roles/{{ $role->idRole }}/edit">Modifier</a>
                    <form action="/roles/{{ $role->idRole }}" method="POST" style="display: inline;">
                        @csrf
                        @method('DELETE')
                        <button type="submit">Supprimer</button>
                    </form>
                </div>
            </div>
            @endforeach
        </div>
    </div>
</div>
@endsection
  

roles/create.blade.php


@extends('layouts.app')
@section('title', 'Ajouter rôle')
@section('content')

<div>Ajouter un rôle</div>
<div>
    <form method="POST" action="{{ route('roles.store') }}">
        @csrf
        <div>
            <label for="nomRole">Nom</label>
            <input id="nomRole" type="text" name="nomRole" value="{{ old('nomRole') }}" required>
            @error('nomRole')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <button type="submit">Ajouter</button>
    </form>
</div>
@endsection

roles/edit.blade.php


@extends('layouts.app')
@section('title', 'Modifier rôle')
@section('content')

<div>Modifier un rôle</div>
<div>
    <form method="POST" action="{{ route('roles.update', $role->idRole) }}">
        @csrf
        @method('PUT')
        <div>
            <label for="nomRole">Nom</label>
            <input id="nomRole" type="text" name="nomRole" value="{{ $role->nomRole }}" required>
            @error('nomRole')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <button type="submit">Modifier</button>
    </form>
</div>
@endsection

utilisateurs/index.blade.php


@extends('layouts.app')
@section('title', 'Liste utilisateurs')
@section('content')


<div>
    <form action="{{ route('utilisateurs.index') }}" method="GET">
        <div>
            <label for="status">Statut :</label>
            <select id="status" name="status">
                <option value="all">Tous</option>
                <option value="active">Active</option>
                <option value="inactive">Inactive</option>
            </select>
            <button type="submit">Filtrer</button>
        </div>
    </form>

    <div>
        @if(session('success'))
            <div>
                {{ session('success') }}
            </div>
        @endif
        @if(session('error'))
            <div>
                {{ session('error') }}
            </div>
        @endif
        <div>
            <div>Liste des utilisateurs</div>
            <div>
                <table>
                    <thead>
                        <tr>
                            <th scope="col">ID</th>
                            <th scope="col">Username</th>
                            <th scope="col">Email</th>
                            <th scope="col">Rôle</th>
                            <th scope="col">Active</th>
                            <th scope="col">Actions</th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach ($utilisateurs as $utilisateur)
                        @if(Auth::user()->role->nomRole === "SuperAdmin" && $utilisateur->role->nomRole === "SuperAdmin")
                            @continue
                        @endif
                        @if((Auth::user()->role->nomRole === "Admin" && $utilisateur->role->nomRole === "SuperAdmin") || (Auth::user()->role->nomRole === "Admin" && $utilisateur->role->nomRole === "Moderateur") || (Auth::user()->role->nomRole === "Admin" && $utilisateur->role->nomRole === "Admin"))
                            @continue
                        @endif
                        @if(Auth::user()->role->nomRole === "Moderateur" && $utilisateur->role->nomRole === "SuperAdmin")
                            @continue
                        @endif

                        <tr>
                            <th scope="row">{{ $utilisateur->id }}</th>
                            <td>{{ $utilisateur->nom }} {{ $utilisateur->prenom }}</td>
                            <td>{{ $utilisateur->email }}</td>
                            <td>{{ $utilisateur->role->nomRole }}</td>
                            <td>{{ $utilisateur->active ? 'Oui' : 'Non' }}</td>
                            <td>
                                @if(Auth::user()->role->nomRole === 'Admin' || Auth::user()->role->nomRole === 'Moderateur' || Auth::user()->role->nomRole === 'SuperAdmin')
                                    @if($utilisateur->active)
                                        <form action="/utilisateurs/{{ $utilisateur->id }}/desactivate" method="POST" style="display: inline;">
                                            @csrf
                                            <button type="submit">Désactiver</button>
                                        </form>
                                    @else
                                        <form action="/utilisateurs/{{ $utilisateur->id }}/activate" method="POST" style="display: inline;">
                                            @csrf
                                            <button type="submit">Activer</button>
                                        </form>
                                    @endif
                                @endif
                                <form action="/utilisateurs/{{ $utilisateur->id }}" method="POST" style="display: inline;">
                                    @csrf
                                    @method('DELETE')
                                    <button type="submit">Supprimer</button>
                                </form>
                            </td>
                        </tr>
                    @endforeach

                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>
@endsection

utilisateurs/edit.blade.php


@extends('layouts.app')
@section('title', 'Show Utilisateur')
@section('content')

<div>
    <div>Photo de profile</div>
    <div>
        @if($utilisateur->photo)
            <img src="/{{ $utilisateur->photo }}" alt="" style="width:195px;height:195px">
        @else
            <img src="https://avatar.iran.liara.run/public/{{ rand(1,20) }}" alt="" style="width:195px;height:195px">
        @endif
        <div>{{ Auth::user()->role->nomRole }}</div>
        <form action="{{ route('utilisateurs.uploadImage', $utilisateur->id) }}" method="POST" enctype="multipart/form-data">
            @csrf
            <div>
                <label for="photo">Photo</label>
                <input id="photo" type="file" name="photo" required>
            </div>
            <button type="submit">Modifier l'image de profile</button>
        </form>
    </div>
</div>
<div>
    <div>Details de profile</div>
    <div>
        <form method="POST" action="{{ route('utilisateurs.update', $utilisateur->id) }}">
            @csrf
            @method('PUT')
            <div>
                <label for="nom">Nom</label>
                <input id="nom" type="text" name="nom" value="{{ $utilisateur->nom }}">
            </div>
            <div>
                <label for="prenom">Prenom</label>
                <input id="prenom" type="text" name="prenom" value="{{ $utilisateur->prenom }}">
            </div>
            <div>
                <label for="email">Email</label>
                <input id="email" type="email" name="email" value="{{ $utilisateur->email }}">
            </div>
            <div>
                <label for="password">Mot de passe</label>
                <input id="password" type="password" name="password" required>
                @error('password')
                <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <div>
                <label for="idRole">Rôle</label>
                <select id="idRole" name="idRole" required @if(Auth()->user()->role->nomRole === 'Utilisateur') disabled @endif>
                    @foreach ($roles as $role)
                        <option value="{{ $role->idRole }}" @if ($role->idRole == $utilisateur->idRole) selected @endif>{{ $role->nomRole }}</option>
                    @endforeach
                </select>
                @if(Auth()->user()->role->nomRole === 'Utilisateur')
                    <input type="hidden" name="idRole" value="{{ $utilisateur->idRole }}">
                @endif
                @error('idRole')
                <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <button type="submit">Modifier</button>
        </form>
    </div>
@endsection

utilisateurs/show.blade.php


@extends('layouts.app')
@section('title', 'Show Utilisateur')
@section('content')

<div>
    <div>
        <div>
        @if($utilisateur->photo)
            <img src="/{{ $utilisateur->photo }}" alt="">
        @else
            <img src="https://avatar.iran.liara.run/public/{{ rand(1,20) }}" alt="Image">
        @endif
        </div>
        <div>
            <h2>{{ $utilisateur->nom }} {{ $utilisateur->prenom }}</h2>
            <p>{{ $utilisateur->role->nomRole }}</p>
            <small>{{ $utilisateur->active ? 'Compte active' : 'Compte inactive' }}</small>
        </div>
    </div>
    <div>
        @if(Auth::user()->role->nomRole === 'SuperAdmin')
            @if($utilisateur->active == 0)
                <form action="/utilisateurs/{{ $utilisateur->id }}/activate" method="POST">
                    @csrf
                    <button type="submit">Activer</button>
                </form>
            @endif
        @endif
        <a href="/utilisateurs/{{ $utilisateur->id }}/edit">Modifier</a>
        <button type="button" data-bs-toggle="modal" data-bs-target="#exampleModal">
            Supprimer le compte
        </button>
    </div>
    <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div>
            <div>
                <h5>Confirmation de la suppression</h5>
                <button type="button" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div>
                Est-ce que vous êtes sûr de vouloir supprimer ce compte ?
            </div>
            <div>
                <button type="button" data-bs-dismiss="modal">Annuler</button>
                <form action="{{ route('utilisateurs.destroy', $utilisateur->id) }}" method="POST">
                    @csrf
                    @method('DELETE')
                    <button type="submit">Confirmer</button>
                </form>
            </div>
        </div>
    </div>
</div>
@foreach($utilisateur->post as $post)
<div>
    <div>
        <div>
            <img src="/{{ $post->imagePost }}" alt="" style="height:300px">
            <div></div>
        </div>
        <div>
            <small>{{ $post->created_at }}</small>
            <small><a href="#">{{ $post->theme->titreTheme }}</a></small>
            <h4><a href="#">{{ $post->titrePost }}</a></h4>
            <p>{{ $post->contenuPost }}</p>
            <div>
                <img src="/{{ $post->utilisateur->photo }}" alt="">
                <div>
                    <h6>{{ $post->utilisateur->nom }} {{ $post->utilisateur->prenom }}</h6>
                </div>
            </div>
        </div>
    </div>
</div>
@endforeach
@endsection

Profile

Supprimer Profile

themes/index.blade.php


@extends('layouts.app')
@section('title', 'Liste thèmes')
@section('content')

<div>
    <a href="/themes/create">Ajouter un nouveau thème</a>
</div>
<div>
    <div>Liste des thèmes</div>
    <div>
        <div>
            @foreach ($themes as $theme)
            <div>
                <div>
                    <h5>{{ $theme->titreTheme }}</h5>
                    <img src="/{{ $theme->photoTheme }}" alt="{{ $theme->titreTheme }}">
                </div>
                <div>
                    <p>{{ $theme->descriptionTheme }}</p>
                    <a href="/themes/{{ $theme->idTheme }}/edit">Modifier</a>
                    <form action="/themes/{{ $theme->idTheme }}" method="POST" style="display: inline;">
                        @csrf
                        @method('DELETE')
                        <button type="submit">Supprimer</button>
                    </form>
                </div>
            </div>
            @endforeach
        </div>
    </div>
</div>
@endsection

themes/create.blade.php


@extends('layouts.app')
@section('title', 'Ajouter thème')
@section('content')

<div>Ajouter un thème</div>
<div>
    <form method="POST" action="{{ route('themes.store') }}" enctype="multipart/form-data">
        @csrf
        <div>
            <label for="titreTheme">Titre</label>
            <input id="titreTheme" type="text" name="titreTheme" value="{{ old('titreTheme') }}" required>
            @error('titreTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="descriptionTheme">Description</label>
            <textarea id="descriptionTheme" name="descriptionTheme" required>{{ old('descriptionTheme') }}</textarea>
            @error('descriptionTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="photoTheme">Photo</label>
            <input id="photoTheme" type="file" name="photoTheme" required>
            @error('photoTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <button type="submit">Ajouter</button>
    </form>
</div>
@endsection

themes/edit.blade.php


@extends('layouts.app')
@section('title', 'Modifier thème')
@section('content')

<div>Modifier un thème</div>
<div>
    <form method="POST" action="{{ route('themes.update', $theme->idTheme) }}" enctype="multipart/form-data">
        @csrf
        @method('PUT')
        <div>
            <label for="titreTheme">Titre</label>
            <input id="titreTheme" type="text" name="titreTheme" value="{{ $theme->titreTheme }}" required>
            @error('titreTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="descriptionTheme">Description</label>
            <textarea id="descriptionTheme" name="descriptionTheme" required>{{ $theme->descriptionTheme }}</textarea>
            @error('descriptionTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="photoTheme">Photo</label>
            <input id="photoTheme" type="file" name="photoTheme">
            @error('photoTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <button type="submit">Modifier</button>
    </form>
</div>
@endsection

posts/index.blade.php


@extends('layouts.app')
@section('title', 'Liste posts')
@section('content')

<div>
    @if(session('success'))
        <div>{{ session('success') }}</div>
    @endif
    @if(session('error'))
        <div>{{ session('error') }}</div>
    @endif
    <div>
        <div>
            @if(Auth::user()->active && Auth::user()->role->nomRole === 'Utilisateur')
                <div>
                    <a href="/posts/create">Ajouter un nouveau post</a>
                </div>
            @endif
        </div>
        <div>
            <form action="{{ route('posts.index') }}" method="GET">
                <div>
                    <label for="statut">Statut :</label>
                    <select id="statut" name="statut">
                        <option value="all">Tous</option>
                        <option value="active">Active</option>
                        <option value="inactive">Inactive</option>
                    </select>
                    <button type="submit">Filtrer</button>
                </div>
            </form>
        </div>
    </div>

    <div>
        <div>Liste des posts</div>
        <div>
            @foreach($posts as $post)
            <div>
                <div>
                    <img src="/{{ $post->imagePost }}" alt="" style="height:300px">
                    <div></div>
                </div>
                <div>
                    <small>{{ $post->created_at }}</small>
                    <small><a href="#">{{ $post->theme->titreTheme }}</a></small>
                    <h4><a href="#">{{ $post->titrePost }}</a></h4>
                    <p>{{ $post->contenuPost }}</p>
                    <div>
                        <img src="/{{ $post->utilisateur->photo }}" alt="" style="width: 40px; height:40px ">
                        <div>
                            <h6>{{ $post->utilisateur->nom }} {{ $post->utilisateur->prenom }}</h6>
                        </div>
                    </div>
                </div>
            </div>
            @endforeach
        </div>
    </div>
</div>
@endsection

Interface SuperAdmin

Interface Utilisateur

posts/create.blade.php


@extends('layouts.app')
@section('title', 'Ajouter post')
@section('content')

<div>
    <div>Ajouter un post</div>
    <div>
        <form method="POST" action="{{ route('posts.store') }}" enctype="multipart/form-data">
            @csrf
            <div>
                <label for="titrePost">Titre</label>
                <input id="titrePost" type="text" name="titrePost" value="{{ old('titrePost') }}" required>
                @error('titrePost')
                    <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <div>
                <label for="contenuPost">Contenu</label>
                <textarea id="contenuPost" name="contenuPost" required>{{ old('contenuPost') }}</textarea>
                @error('contenuPost')
                    <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <div>
                <label for="idTheme">Thème</label>
                <select id="idTheme" name="idTheme" required>
                    @foreach ($themes as $theme)
                        <option value="{{ $theme->idTheme }}">{{ $theme->titreTheme }}</option>
                    @endforeach
                </select>
                @error('idTheme')
                    <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <div>
                <label for="idUtilisateur">Utilisateur</label>
                <select id="idUtilisateur" name="idUtilisateur" required disabled>
                    <option value="{{ Auth::id() }}">{{ Auth::user()->nom }}</option>
                </select>
                @error('idUtilisateur')
                    <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            @if(Auth::user()->role->nomRole !== 'Utilisateur')
                <div>
                    <input id="active" type="checkbox" name="active" required>
                    <label for="active">Actif</label>
                </div>
            @endif
            <div>
                <label for="imagePost">Image</label>
                <input id="imagePost" type="file" name="imagePost" value="{{ old('imagePost') }}" required>
                @error('imagePost')
                    <span role="alert">{{ $message }}</span>
                @enderror
            </div>
            <button type="submit">Ajouter</button>
        </form>
    </div>
</div>
@endsection

posts/edit.blade.php


@extends('layouts.app')
@section('title', 'Modifier post')
@section('content')

<div>Modifier un post</div>
<div>
    <form method="POST" action="{{ route('posts.update', $post->idPost) }}" enctype="multipart/form-data">
        @csrf
        @method('PUT')
        <div>
            <label for="titrePost">Titre</label>
            <input id="titrePost" type="text" name="titrePost" value="{{ $post->titrePost }}" required>
            @error('titrePost')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="contenuPost">Contenu</label>
            <textarea id="contenuPost" name="contenuPost" required>{{ $post->contenuPost }}</textarea>
            @error('contenuPost')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="idTheme">Thème</label>
            <select id="idTheme" name="idTheme" required>
                @foreach ($themes as $theme)
                    <option value="{{ $theme->idTheme }}" @if ($theme->idTheme == $post->idTheme) selected @endif>{{ $theme->titreTheme }}</option>
                @endforeach
            </select>
            @error('idTheme')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="idUtilisateur">Utilisateur</label>
            <select id="idUtilisateur" name="idUtilisateur" required>
                @foreach ($utilisateurs as $utilisateur)
                    <option value="{{ $utilisateur->id }}" @if ($utilisateur->id == $post->idUtilisateur) selected @endif>{{ $utilisateur->nom }}</option>
                @endforeach
            </select>
            @error('idUtilisateur')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <div>
            <label for="imagePost">Image</label>
            <input id="imagePost" type="file" name="imagePost" accept="image/*">
            @error('imagePost')
                <span role="alert">{{ $message }}</span>
            @enderror
        </div>
        <button type="submit">Modifier</button>
    </form>
</div>
@endsection