Cours Laravel Complet 🔴

Les 12 chapitres essentiels — Eloquent, Blade, API, middleware et déploiement

12
Chapitres
100+
Exemples de code
Laravel 11+
Version
A1→C2
Niveaux

CHAPITRE 01

Introduction et installation

🔴 Créer un projet Laravel
# Installer Laravel (nécessite PHP 8.2+ et Composer)
composer create-project laravel/laravel mon-app
cd mon-app

# OU avec le launcher Laravel
composer global require laravel/installer
laravel new mon-app

# Lancer le serveur
php artisan serve # → http://127.0.0.1:8000

# Structure (simplifiée Laravel 11) :
# mon-app/
# ├── app/
# │ ├── Http/Controllers/
# │ ├── Models/
# │ └── Providers/
# ├── routes/
# │ ├── web.php (routes web)
# │ └── api.php (routes API)
# ├── resources/views/ (templates Blade)
# ├── database/migrations/
# ├── .env (config environnement)
# └── composer.json

Laravel est le framework PHP le plus populaire au monde. Créé par Taylor Otwell en 2011, il suit le pattern MVC et offre un écosystème riche : Eloquent ORM, Blade templates, migrations, queues, broadcasting. Utilisé par Twitch, BBC, 9GAG, Pfizer et Invoice Ninja.

🏗️ Laravel en résumé
CaractéristiqueLaravel
ArchitectureMVC (Model-View-Controller)
ORMEloquent (Active Record, puissant)
TemplatesBlade (héritage, composants)
CLIArtisan (génération, migrations, tinker)
AuthBreeze / Jetstream / Fortify
TestsPHPUnit + Pest intégrés
ÉcosystèmeForge, Vapor, Nova, Livewire, Inertia

CHAPITRE 02

Routes et contrôleurs

🔗 Routes
// routes/web.php
use Illuminate\Support\Facades\Route;

// Route simple
Route::get('/', function () );

// Route avec paramètre
Route::get('/users/', function ($id) );

// Paramètre optionnel
Route::get('/posts/', function ($slug = null) );

// Routes nommées
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');

// Groupes (middleware, préfixe)
Route::middleware('auth')->group(function () );

// Resource (CRUD automatique)
Route::resource('posts', PostController::class);

🎮 Contrôleurs
// php artisan make:controller PostController –resource

// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;

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

class PostController extends Controller

Route Model Binding : en typant Post $post dans le paramètre, Laravel récupère automatiquement le modèle par son ID (ou slug). Si l'objet n'existe pas, il renvoie une erreur 404 automatiquement. Plus besoin de findOrFail().

CHAPITRE 03

Blade (templates)

📝 Syntaxe Blade




</span>@yield(<span class="st">'title'</span>, <span class="st">'Mon Site'</span>)<span class="dc">



@yield('content')


@extends('layouts.app')

@section('title', 'Blog')

@section('content')

Articles

@forelse ($posts as $post)


@empty

Aucun article.


@endforelse

@auth

Bienvenue


@endauth

@guest
« >Connexion
@endguest
@endsection

échappe automatiquement le HTML (protection XSS). Pour du HTML brut, utilisez avec précaution. Blade compile les templates en PHP pur — pas de perte de performance.

CHAPITRE 04

Modèles et Eloquent ORM

🗄️ Modèles Eloquent
// php artisan make:model Post -mfc
// -m = migration, -f = factory, -c = controller

// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model

// CRUD avec Eloquent

// Create
$post = Post::create([
'title' => 'Mon article',
'content' => 'Contenu…',
]);

// Read
$posts = Post::all();
$post = Post::find(1);
$post = Post::findOrFail(1);
$posts = Post::where('published', true)->latest()->get();
$post = Post::where('slug', $slug)->firstOrFail();

// Update
$post->update(['title' => 'Nouveau titre']);

// Delete
$post->delete();

// Scopes (requêtes réutilisables)
// Dans le modèle :
public function scopePublished($query)

// Utilisation :
Post::published()->latest()->get();

CHAPITRE 05

Migrations et base de données

📦 Migrations
// php artisan make:migration create_posts_table

// database/migrations/xxxx_create_posts_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
;

# Commandes migrations
php artisan migrate # Appliquer
php artisan migrate:rollback # Annuler la dernière
php artisan migrate:fresh –seed # Tout recréer + seeder

CHAPITRE 06

Relations Eloquent

🔗 Types de relations
// User has many Posts (1→N)
class User extends Model

// Post belongs to User (N→1)
class Post extends Model

// Utilisation
$user->posts; // Collection de posts
$post->author->name; // Nom de l'auteur
$post->tags; // Collection de tags

// Eager loading (éviter N+1)
$posts = Post::with('author', 'tags')->get();

// Attach / Detach (Many to Many)
$post->tags()->attach([1, 2, 3]);
$post->tags()->sync([1, 3]); // Remplace tout

CHAPITRE 07

Formulaires et validation

📝 Validation
// Dans le contrôleur
public function store(Request $request)

« >
@csrf


Titre
« >
@error('title')

@enderror


@csrf est obligatoire dans tous les formulaires POST/PUT/DELETE. Laravel vérifie automatiquement le token CSRF. Pour les méthodes PUT/PATCH/DELETE, ajoutez @method('PUT') dans le formulaire (les formulaires HTML ne supportent que GET et POST).

CHAPITRE 08

Authentification

🔐 Laravel Breeze
# Installer Breeze (auth complète en 2 commandes)
composer require laravel/breeze –dev
php artisan breeze:install

# Choix : Blade, React, Vue, API
# Génère : login, register, reset password, email verification

npm install && npm run dev
php artisan migrate

// Protéger des routes
Route::middleware('auth')->group(function () );

// Dans le contrôleur
public function __construct()

// Utilisateur connecté
$user = auth()->user();
$id = auth()->id();

// Blade
@auth

Bienvenue


@endauth

Breeze = auth simple et personnalisable. Pour plus de fonctionnalités (2FA, teams, API tokens), utilisez Jetstream. Pour les API stateless, utilisez Sanctum (tokens API).

CHAPITRE 09

API REST

🔌 API Resources
// php artisan make:resource PostResource

// app/Http/Resources/PostResource.php
class PostResource extends JsonResource

// routes/api.php
Route::apiResource('posts', PostApiController::class);

// Contrôleur API
class PostApiController extends Controller

CHAPITRE 10

Artisan et CLI

⚙️ Commandes Artisan essentielles
# Générer
php artisan make:model Post -mfc # Model + migration + factory + controller
php artisan make:controller PostController –resource
php artisan make:migration add_slug_to_posts
php artisan make:middleware CheckAdmin
php artisan make:resource PostResource
php artisan make:request StorePostRequest

# Base de données
php artisan migrate
php artisan migrate:rollback
php artisan migrate:fresh –seed
php artisan db:seed

# Debug
php artisan tinker # REPL interactif (comme irb/python)
php artisan route:list # Toutes les routes

# Cache
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize # Tout cacher

# Maintenance
php artisan down # Mode maintenance
php artisan up

Tinker est un outil extrêmement puissant pour interagir avec votre application en ligne de commande. Créer des utilisateurs, tester des requêtes Eloquent, débugger — tout sans ouvrir le navigateur.

CHAPITRE 11

Déploiement

🚀 Production
# .env production
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:… # php artisan key:generate
DB_CONNECTION=mysql
DB_HOST=your-db-host
DB_DATABASE=your-db
DB_USERNAME=your-user
DB_PASSWORD=your-pass

# Optimiser pour la production
composer install –no-dev –optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize
npm run build

PlateformeIdéal pour
Laravel ForgeOfficiel, gère VPS (DigitalOcean, AWS), auto-deploy
Laravel VaporServerless sur AWS Lambda (auto-scaling)
RailwaySimple, PostgreSQL, git push
DigitalOceanVPS, Nginx + PHP-FPM, contrôle total
Shared hostingCPanel, pas idéal mais possible

CHAPITRE 12

Bonnes pratiques

🧩 Écosystème Laravel
OutilUsage
LivewireComposants réactifs full-stack (comme React mais en PHP)
Inertia.jsSPA avec Vue/React sans API — pages côté serveur
FilamentAdmin panel (alternative à Nova, gratuit)
SanctumAuth API (tokens, SPA)
HorizonDashboard pour les queues Redis
TelescopeDebug (requêtes, logs, jobs, mail)
PestFramework de tests moderne (syntaxe élégante)
✅ Bonnes pratiques

✅ À FAIRE
• Route Model Binding (type-hint)
$fillable sur chaque modèle
• Eager loading with() (éviter N+1)
@csrf dans tous les formulaires
• Form Requests pour la validation
• Scopes pour les requêtes réutilisables
• API Resources pour les réponses JSON
php artisan optimize en prod
• Pest / PHPUnit pour les tests

❌ À ÉVITER
APP_DEBUG=true en production
• Logique métier dans les contrôleurs
$guarded = [] (mass assignment)
• Requêtes N+1 (boucle + relation)
• SQL brut sans bindings
• Ignorer les migrations
• Stocker des fichiers dans public/
• Pas de validation d'input
• Oublier @method pour PUT/DELETE

🧠 Quiz
Qu'est-ce que le « mass assignment » et pourquoi $fillable ?
Le mass assignment permet de créer/modifier un modèle avec un tableau : Post::create($data). Sans $fillable, un utilisateur malveillant pourrait injecter des champs non prévus (ex: is_admin=true). $fillable liste les seuls champs autorisés en mass assignment — c'est une protection de sécurité essentielle.
Livewire vs Inertia — quand choisir quoi ?
Livewire = tout en PHP/Blade, pas de JS à écrire, réactivité côté serveur (idéal si vous ne connaissez pas JS). Inertia = SPA avec Vue/React côté front, mais routing et contrôleurs Laravel côté serveur (idéal si vous aimez Vue/React mais voulez la simplicité Laravel).

Cours Laravel Complet — Eloquent, Blade, API REST et déploiement

Référence : laravel.com/docs | Livewire | Filament