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
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
<?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
<?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
Ajouter un rôle
Modifier un rôle
<?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
Modifier un utilisateur
<?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
Ajouter un thème
Modifier un thème
<?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.
Liste des posts de l'utilisateur
Ajouter un post
Modifier un post
<?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
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
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