Cours Laravel Complet 🔴
Les 12 chapitres essentiels — Eloquent, Blade, API, middleware et déploiement
🏠 Hub Programmation
🐘 PHP (prérequis)
🎨 HTML & CSS
⚡ JavaScript
☁️ AWS Cloud Practitioner
Introduction et installation
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.
| Caractéristique | Laravel |
|---|---|
| Architecture | MVC (Model-View-Controller) |
| ORM | Eloquent (Active Record, puissant) |
| Templates | Blade (héritage, composants) |
| CLI | Artisan (génération, migrations, tinker) |
| Auth | Breeze / Jetstream / Fortify |
| Tests | PHPUnit + Pest intégrés |
| Écosystème | Forge, Vapor, Nova, Livewire, Inertia |
Routes et contrôleurs
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);
// 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().
Blade (templates)
…
@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.
Modèles et Eloquent ORM
// -m = migration, -f = factory, -c = controller
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
// 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();
Migrations et base de données
// 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
;
php artisan migrate # Appliquer
php artisan migrate:rollback # Annuler la dernière
php artisan migrate:fresh –seed # Tout recréer + seeder
Relations Eloquent
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
Formulaires et validation
public function store(Request $request)
Publier
@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).
Authentification
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
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).
API REST
// app/Http/Resources/PostResource.php
class PostResource extends JsonResource
Route::apiResource('posts', PostApiController::class);
// Contrôleur API
class PostApiController extends Controller
Artisan et CLI
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.
Déploiement
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
| Plateforme | Idéal pour |
|---|---|
| Laravel Forge | Officiel, gère VPS (DigitalOcean, AWS), auto-deploy |
| Laravel Vapor | Serverless sur AWS Lambda (auto-scaling) |
| Railway | Simple, PostgreSQL, git push |
| DigitalOcean | VPS, Nginx + PHP-FPM, contrôle total |
| Shared hosting | CPanel, pas idéal mais possible |
Bonnes pratiques
| Outil | Usage |
|---|---|
| Livewire | Composants réactifs full-stack (comme React mais en PHP) |
| Inertia.js | SPA avec Vue/React sans API — pages côté serveur |
| Filament | Admin panel (alternative à Nova, gratuit) |
| Sanctum | Auth API (tokens, SPA) |
| Horizon | Dashboard pour les queues Redis |
| Telescope | Debug (requêtes, logs, jobs, mail) |
| Pest | Framework de tests moderne (syntaxe élégante) |
✅ À 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
🏠 Hub Programmation
🐘 Cours PHP
🎨 Cours HTML & CSS
⚡ Cours JavaScript
☁️ AWS Cloud Practitioner
Cours Laravel Complet — Eloquent, Blade, API REST et déploiement
Référence : laravel.com/docs | Livewire | Filament
