Qu'est-ce que Laravel ?

Laravel est un framework PHP gratuit et open-source créé par Taylor Otwell. Il permet de développer des applications web de manière structurée, rapide et maintenable grâce à l'architecture MVC (Model-View-Controller).

Piliers de Laravel

Structure MVC

CoucheFichiersRôle
Modelapp/Models/*.phpReprésente une table, gère les données (CRUD)
Viewresources/views/*.blade.phpAffiche le HTML (templates)
Controllerapp/Http/Controllers/*.phpReçoit la requête, appelle le modèle, retourne la vue
Migrationdatabase/migrations/*.phpDéfinit la structure des tables
Routesroutes/web.phpMappe URL → Controller@method
Premier défi : app TodoList complète →

Commandes Artisan — Référence complète

Artisan est la CLI de Laravel. Chaque commande suit le format : php artisan [categorie]:[action] [options]

🚀 Serveur

php artisan serve Lance localhost:8000
php artisan serve --port=9000 Port personnalisé

🏗️ Génération

make:model Nom Modèle Eloquent
make:model Nom -m Modèle + migration
make:model Nom -mc Modèle + migration + controller
make:model Nom -mcr +resource controller
make:controller Nom Controller vide
make:controller Nom -r Controller CRUD
make:migration nom --create=table Nouvelle table
make:migration nom --table=table Modifier table

🗄️ Migrations

migrate Exécute les migrations
migrate:rollback Annule le dernier batch
migrate:rollback --step=2 Annule 2 batches
migrate:fresh Drop all + migrate
migrate:fresh --seed + Seeders
migrate:reset Rollback TOUTES
migrate:status Statut des migrations

🧹 Cache

cache:clear Vide le cache app
config:clear Vide le cache config
route:clear Vide le cache routes
view:clear Vide le cache vues
optimize:clear Vide TOUT le cache

📋 Informations

route:list Liste toutes les routes
migrate:status État des migrations
php artisan list Toutes les commandes
php artisan help [cmd] Aide sur une commande

🌱 Données

make:seeder NomSeeder Crée un seeder
db:seed Lance les seeders
make:factory NomFactory Crée une factory

Serveur de développement

CommandeOptionDescription
php artisan serve Lance le serveur sur http://127.0.0.1:8000
php artisan serve --port=9000 Changer le port d'écoute
php artisan serve --host=0.0.0.0 Accessible depuis le réseau local

Génération de fichiers (make:*)

CommandeOptions principalesDescription
php artisan make:model Nom
-m migration
-c controller
-r resource ctrl
-s seeder
-f factory
-mc modèle+ctrl
-mcr tout-en-un
Génère un modèle Eloquent dans app/Models/.
Exemple : php artisan make:model Post -m → crée Post.php + migration
Puissant : php artisan make:model Article -mcr → modèle + migration + controller resource
php artisan make:controller Nom
--resource / -r CRUD
--api API (sans create/edit)
--model=Nom lie un modèle
--invokable méthode unique __invoke
Génère un contrôleur dans app/Http/Controllers/.
--resource ajoute : index, create, store, show, edit, update, destroy
php artisan make:migration nom
--create=table nouvelle table
--table=table modifier table existante
Génère une migration dans database/migrations/.
Convention : create_XXX_table (nouvelle) / add_XXX_to_YYY_table (modification)
php artisan make:seeder Nom Génère un seeder pour insérer des données de test
php artisan make:request Nom Génère une Form Request (validation des données)

Migrations

CommandeOptionsDescription
php artisan migrate --force (production) Exécute toutes les migrations en attente
php artisan migrate:rollback --step=N N batches Annule le dernier batch de migrations (down())
php artisan migrate:fresh --seed avec seeders ⚠️ Supprime TOUTES les tables puis relance toutes les migrations
php artisan migrate:reset Annule TOUTES les migrations (rollback de toutes)
php artisan migrate:status Affiche l'état (Ran/Pending) de chaque migration

Cache

CommandeCible
php artisan cache:clear Cache général de l'application (Redis, Memcached…)
php artisan config:clear Cache de configuration (.env modifié → toujours exécuter)
php artisan route:clear Cache des routes
php artisan view:clear Cache des vues Blade compilées
php artisan optimize:clear 🔥 Vide TOUT le cache en une commande

Les options en détail — Comprendre les flags

Les options (flags) modifient le comportement d'une commande. Clique pour voir les détails.

make:model Nom -m / --migration

Crée le modèle ET génère automatiquement le fichier de migration correspondant.

php artisan make:model Post -m
// Génère :
app/Models/Post.php
database/migrations/2025_01_01_000000_create_posts_table.php
make:model Nom -mc / --migration --controller

Crée le modèle + migration + controller (vide) en une seule commande.

php artisan make:model Article -mc
// Génère :
app/Models/Article.php
database/migrations/..._create_articles_table.php
app/Http/Controllers/ArticleController.php
make:model Nom -mcr — Le combo puissant

Tout-en-un : Modèle + Migration + Controller Resource (avec 7 méthodes CRUD prêtes)

php artisan make:model Produit -mcr
// Le controller contient automatiquement :
index()     → afficher liste
create()    → formulaire de création
store()     → enregistrer en BDD
show()      → afficher un élément
edit()      → formulaire de modification
update()    → sauvegarder modification
destroy()   → supprimer
make:controller Nom --resource vs --api
OptionMéthodes généréesUsage
Aucune (controller vide)Si tu veux tout écrire à la main
--resource / -rindex, create, store, show, edit, update, destroy (7)App web avec formulaires
--apiindex, store, show, update, destroy (5) — sans create/editAPI REST (pas de formulaires HTML)
make:migration nom --create=table vs --table=table
OptionUtilitéContenu généré dans up()
--create=table Crée une nouvelle table Schema::create('table', ...)
--table=table Modifie une table existante (ajouter/supprimer colonne) Schema::table('table', ...)

Convention de nommage :

• Nouvelle table → create_posts_table
• Ajout de colonne → add_role_to_users_table
• Suppression → remove_phone_from_users_table

migrate:rollback --step=N — contrôle précis

Par défaut, migrate:rollback annule seulement le dernier batch. Avec --step=N, on choisit combien de batches annuler.

php artisan migrate:rollback            → annule 1 batch (le dernier)
php artisan migrate:rollback --step=3   → annule les 3 derniers batches
php artisan migrate:reset               → annule TOUTES les migrations
migrate:fresh --seed — workflow de dev

Combine le rechargement de la base ET l'insertion de données de test en une commande. Workflow de développement courant :

php artisan migrate:fresh --seed
// Équivalent à :
php artisan migrate:fresh     → Drop + migrate
php artisan db:seed           → Insère les données de test

QCM — Commandes & Options

25 questions · 25 secondes par question

Teste tes connaissances sur les commandes Artisan, leurs options, les migrations et la structure MVC.

Exercice — Saisie des commandes

12 questions · Tape la commande exacte

Tape la commande Artisan complète (copier-coller désactivé). Tu peux utiliser Entrée pour valider.

Migrations — Du schéma relationnel au code

Objectif : convertir un schéma relationnel (tables + clés) en migrations Laravel avec up() et down().

Rappel de notation : attribut souligné = Clé Primaire (PK) · #attribut = Clé Étrangère (FK)

Règle d'or : La table avec la FK doit être créée APRÈS la table qu'elle référence.

Cas 1 — One to One · users ↔ profiles

users(id, name, email)
profiles(id, #user_id, bio, phone)
user_id UNIQUE → 1 profil par utilisateur · Créer users EN PREMIER car profiles dépend de users

📄 Migration 1 — create_users_table

// php artisan make:migration create_users_table

public function up(): void
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamps();
    });
}

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

📄 Migration 2 — create_profiles_table

// php artisan make:migration create_profiles_table

public function up(): void
{
    Schema::create('profiles', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')
               ->unique()       // 1-to-1
               ->constrained()  // FK → users.id
               ->cascadeOnDelete();
        $table->text('bio')->nullable();
        $table->string('phone')->nullable();
        $table->timestamps();
    });
}

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

Cas 2 — One to Many · users → posts

users(id, name)
posts(id, #user_id, title, body)
Un user a plusieurs posts → FK côté posts (sans unique) · Créer users EN PREMIER

📄 Migration 1 — create_users_table

// php artisan make:migration create_users_table

public function up(): void
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}

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

📄 Migration 2 — create_posts_table

// php artisan make:migration create_posts_table

public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')
               ->constrained()      // FK → users.id
               ->cascadeOnDelete(); // post supprimé si user supprimé
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}

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

Cas 3 — Many to Many · posts ↔ tags (table pivot)

posts(id, title)
tags(id, name)
post_tag(#post_id, #tag_id) ← table pivot
Créer posts ET tags EN PREMIER · post_tag en dernier car elle référence les deux

📄 Migration 1 — create_posts_table

// php artisan make:migration create_posts_table

public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
}

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

📄 Migration 2 — create_tags_table

// php artisan make:migration create_tags_table

public function up(): void
{
    Schema::create('tags', function (Blueprint $table) {
        $table->id();
        $table->string('name')->unique();
        $table->timestamps();
    });
}

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

📄 Migration 3 — create_post_tag_table  (table pivot · après posts et tags)

// php artisan make:migration create_post_tag_table

public function up(): void
{
    Schema::create('post_tag', function (Blueprint $table) {
        $table->foreignId('post_id')->constrained()->cascadeOnDelete();
        $table->foreignId('tag_id')->constrained()->cascadeOnDelete();
        $table->primary(['post_id', 'tag_id']); // clé primaire composite
    });
}

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

Types de colonnes les plus utilisés

Méthode BlueprintType SQLExemple d'usage
$table->id()BIGINT UNSIGNED AUTO_INCREMENT PKToujours en premier
$table->string('col')VARCHAR(255)name, email, title…
$table->string('col', 100)VARCHAR(100)Longueur personnalisée
$table->text('col')TEXTbody, description longue
$table->integer('col')INTage, quantity…
$table->boolean('col')TINYINT(1)is_active, published…
$table->decimal('col', 8, 2)DECIMAL(8,2)prix, montant
$table->date('col')DATEbirth_date, start_date
$table->timestamps()created_at + updated_atToujours en dernier
$table->foreignId('user_id')BIGINT UNSIGNEDClé étrangère (FK)
->nullable()NULL autoriséModificateur chaînable
->unique()UNIQUEemail, slug, username
->default(val)DEFAULT val->default(0), ->default(true)

Pratique — Schéma → Migration

À partir du schéma relationnel donné, construis la migration Laravel correcte. Sélectionne les bonnes méthodes Blueprint.

Exercice 1 — Table categories

📐 Schéma :

categories(id, name UNIQUE, description NULLABLE)

Pas de FK. name est unique. description peut être vide.

🧩 Construis la migration :

Exercice 2 — Table products avec FK

📐 Schéma :

categories(id, name)
products(id, #category_id, name, price, stock)

price = montant décimal. stock = entier. category_id = FK vers categories.

🧩 Construis la migration products :

Exercice 3 — Ajouter une colonne à une table existante

📐 Contexte :

users(id, name, email)
→ Ajouter : role (VARCHAR, default 'user') + phone (NULLABLE)

La table users existe déjà → migration de modification.

🧩 Choisis la bonne approche :

Exercice — Écris la migration

Je te donne le schéma relationnel · Tu écris les fonctions up() et down() · Je valide et note les erreurs

4 schémas · Écriture libre · Validation intelligente

Écris les fonctions up() et down() complètes · Des indices progressifs disponibles si tu bloques.

Prochaines sections

On travaillera section par section ensemble !